ロード・トゥ・ザ・ホワイトハッカー

ホワイトハッカーはじめました

pandasの覚え

pandasの情報元

 この本で一通り勉強しました。

 

この本は、GitHubにサンプルコードがあります。

github.com

 

本家のドキュメントは、こちら。

pandas.pydata.org

DataFrameの3要素
  • インデックス
  • カラム
  • データ

 各要素へのアクセス方法

movie = pd.read_csv('data/movie.csv')
columns = movie.columns
index = movie.index
data = movie.values

 DataFrameの作成

クラッチでの作成

 df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))

 

ファイルを読み込み作成(よく使うもの)

#CSV
df = pd.read_csv(ファイルパス)

#Excel
df = rpd.ead_excel(ファイルパス)

#HTML
df = pd.read_html(io='https://example.com/')

よく使うパラメーター

index_col

encoding

 

ドキュメント 

Input/output — pandas 1.3.0 documentation (pydata.org)

 

  • DataFrameの全体の操作

df.head()

df.tail()
df.shape
df.size
df.ndim()
len(df)
df.count()
df.describe()
df.info()

  • <要約統計>

mix,max,mean,median,std

 

  • <欠損値の確認>

df.isnull().sum()

  

  • <ソート>

df.sort_values(['columnA','columnB'] , ascending=False)
df.nlargest(10, 'columnA').nsmallest(5, 'columnB')

  

データの部分抽出
  • インデックスが数字の場合

df.iloc[1]

df.iloc1,2,3:インデックスが1から3

df.iloc[1:10] : インデックスが1から10

df.iloc[1:10:3] : インデックスが1から10で、3個づつ

 

df.iloc[1:10,0:5] : インデックスが1から10で、すべての先頭から5つのカラム

df.iloc[1:10,:10] : インデックスが1から10で、すべての先頭から10つのカラム

  

  • インデックスが文字の場合

df.loc['A']

df.loc'A','B','C':インデックスがAからC

df.loc['A':'C'] : インデックスがAからC

df.loc['A':'Z':3] : インデックスがAからZで、3個づつ

  

  • カラムのみの選択

df.fileter(like='col')

df.filter(items=['one', 'three'])

df'colA','colB'

  

Booleanインデックス法
  • 単一条件

df_ser = df['colA'] > 10

 

  • 複数条件

criteria1 = df.colA > 8

criteria2 = df.colB == 'hoge'

final = criteria1 & criteria2

df.loc[final]

  

  • トップ5を除く

top5 = df.colA.value_counts().index[:5]

criteria=~df.colA.isin(top5)

df[criteria]

  

  • クエリメソッド

depts=['A','B']

qs = 'colA in @depts and colB > 10'

df.query(qs)

 

  • whereメソッド

df.where(criteria, other=100)

 

カラムの追加と削除

 

  • フォーマット

df['colA'] = pd.to_datetime(df['colB'], format ='%H:%M:%S.%f')

 

mapping = {'A':'123','B':'345'}df['colC'] = df['colD'].map(mapping)

 

  • lambda式

df['colE'] = df['colF'].fillna('').apply(lambda x : 'A' if x =='' else 'B')

 

  • 独自ファンクション

def cust(x): 

 if x='':   

  return 'A' 

 else:   

  return 'B'

 

df['colZ'] = df['colX'].apply(cust)

 

集約
  • 基本

group_col=['colA','colB']

agg_col={'ABC':['sum','mean'],'EFG':['mean']}

df.groupby(group_col).agg(agg_col)

※集約関数は独自ファンクション指定化

  

  • グループオブジェクトの操作

grouped =df.groupby(['colA','colB'])

grouped.get_group( ('A','B') )

 

データ再構成

df.stack

df.unstack

df.melt

df.pivot_table

 

結合
  • concat:複数のDataFrameを鉛直及び水平に連結する
  • join:複数のDataFrameを水平に結合
  • merge:2つDataFrameを水平に結合

 

  • concat

鉛直

s_list=[df2016,df2017]

pd.concat(s_list)

pd.concat(s_list, keys=['2016','2017'], names=['year','Symbols'])

 

水平

 s_list=[df2016,df2017]

pd.concat(s_list, keys=['2016','2017'], axis='colimns', names=['year','Symbols'])

pd.concat(s_list, join='inner', keys=['2016','2017'], axis='colimns', names=['year','Symbols'])

※concatのjoinパラメターはinner or outerしかない

 

  • join

ohter = [df2.add_suffix('_2017'), df3.add_suffix('_2018')]

df1.add_suuffix('_2016').join(ohter, how='outer')

 

  • merge

df1.merge(df2,on=['colA','colB'],how='left')