pandasの情報元
この本で一通り勉強しました。
この本は、GitHubにサンプルコードがあります。
本家のドキュメントは、こちら。
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"))
ファイルを読み込み作成(よく使うもの)
#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'])
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')