はじめに
高度な機械学習用のデータ分析などに利用されているpandasですが、直感的で簡単にデータを操作できるため、高度な利用だけでなく、日々の業務にも利用できるんじゃ無いかと思い、備忘録として基本的操作をまとめます。
勉強中ですのでどんどん更新していきます。
エクセルやcsvファイルに入っているデータを読み出して、計算したり、ちょっとしたグラフ作成したりできます。表計算(エクセル)はどんな仕事でも使うと思うので、簡単な使い方を理解するだけですぐ利用できます。
また、時系列データの操作にも強いので、株価データの取り扱いなど様々なことに応用できるかと思います。
データ操作の学習には、jupyter notebookを利用することをお勧めします。
インストール
$ pip3 install pandas
インポート
pd としてインポートするのが慣例。
import pandas as pd
DataFrameの作成
① 値のリストを渡して、カラム名もリストで指定
import pandas as pd
df = pd.DataFrame([[1, 2, 3], [2, 4, 6], [3, 6, 9]],
columns=['column1','column2','columns'])
# インデックス名(行名)を指定したい際は、同様に、index=['index1','index2', 'index3']を追加する。
print(df)
② カラム名をキーとした辞書を渡すことも可能。
import pandas as pd
df = pd.DataFrame({
'column1': [1, 2, 3],
'column2': [2, 4, 6],
'column3': [3, 6, 9],
})
print(df)
どちらも結果は以下のようになる。
column1 column2 column3
0 1 2 3
1 2 4 6
2 3 6 9
CSVデータとして保存
df.to_csv('test.csv')
CSVを読み込んで、列名/行名を取得
pandasはデフォルトで自動的にcsvファイルの1行目をカラム名として読んでくれる。(便利)
インデックスは、0,1,2,..と自動で付与される。
import pandas as pd
# 読み込みは、read_csvをつかう。
df = pd.read_csv('test.csv')
# インデックスオブジェクトを返す。
print(df.columns)
# リストを返す
print(df.columns.values)
行名が欲しい場合は、"columns"を"index"にする。
# インデックスオブジェクト
Index(['column1', 'column2', 'column3'], dtype='object')
# リスト
['column1', 'column2', 'column3']
※ Headerがない(列名が無いファイル)を読み込む際は、引数header=Noneを追加すると列名にも自動で、0,1,2,..と付与される。
pd.read_csv('test.csv', header=None)
CSV以外の各種データの読み込み
# Excelファイル
# デフォルトでは1番目のシートを読み出すが、指定可能。
pd.read_excel('test.xlsx')
pd.read_excel('test.xlsx', sheetname='Sheet3')
# sql
pd.read_sql('SELECT * FROM test', conn)
# json
pd.read_json('test.json')
# tsv(2通り。どちらでも可能)
pd.read_table('test.tsv')
pd.read_csv('test.tsv', sep='\t')
データフレームの操作
上からor下から指定行数分取り出す
行数を指定しなければ、デフォルトで5行分表示される。
# 上から2行分
df.head(2)
# 下から2行分
df.tail(2)
データフレームの行数、列数を確認する
タプル型で行数、列数が返ってくる。
df.shape
# => (3, 3)
行と列の入れ替え
df.T
特定の行の値を取り出す
色々やり方ありますが、下記は、df[カラム名]で取り出す方法。
df['column1']
column1
0 1
1 2
2 3
特定の範囲の値を取り出す
.locを使う。
indexの"0"と"2"の、columns"1~2"を取り出す。
df.loc[[0, 2],0:2]
column1 column2
0 1 2
2 3 6
列名を変更する
df = df.rename(columns={'column1':'col1', 'column2':'col2'})
col1 col2 column3
0 1 2 3
1 2 4 6
2 3 6 9
行を削除する
# index=1の行を削除
df = df.drop('1', axis=0) # axis=0は書かなくてもOK
列を削除する
# 'column3'の列を削除
df = df.drop('column3', axis=1)
各列の型を調べる
df.dtypes
特定の列をインデックスにする
df.set_index['column2']
統計的メソッド
df.mean()
column1 2.0
column2 4.0
column3 6.0
df.mean().mean()
4.0
他各種統計的メソッド
# 合計
df['column2'].sum()
# 中央値
df['column2'].median()
# 最小値
df['column2'].min()
# 最大値
df['column2'].max()
# 標準偏差
df['column2'].std()
# 分散
df['column2'].var()
# 欠損値を除いたデータ数
df['column2'].count()
# 最頻出するデータの値
df['column2'].top()
# 最頻出するデータ数
df['column2'].freq()
データをソートする
列名を指定して、降順/昇順をFalse/Trueで指定
df.sort_values('column3', ascending=False)
groupbyメソッド
下記のようなデータフレームがあるとする。(各年各月の支出)
groupbyメソッドを利用することで、各年毎や各月毎の合計支出や平均支出といった統計が取れる。
df_pay
年 | 月 | 食費 | 娯楽 | 家賃 | |
---|---|---|---|---|---|
0 | 2014 | 1 | 30000 | 35000 | 80000 |
1 | 2014 | 2 | 32000 | 28000 | 80000 |
... | ... | ... | ... | ... | ... |
46 | 2018 | 11 | 32000 | 42000 | 100000 |
47 | 2018 | 12 | 35000 | 40000 | 100000 |
# 各年毎の各種支出の合計
# 各月毎なら'年'を'月'に
df_pay.groupby('年').sum()
月 食費 娯楽 家賃
年
2014 78 372000 342000 960000
2015 78 342000 332000 960000
2016 78 352000 384000 960000
2017 78 412000 372000 1200000
2018 78 382000 400000 1200000
他の各種統計的メソッドももちろん利用可能
# 平均値
df_pay.groupby('年').mean()
# 中央値
df_pay.groupby('年').median()
# 最小値
df_pay.groupby('年').min()
# 最大値
df_pay.groupby('年').max()
# 標準偏差
df_pay.groupby('年').std()
# 分散
df_pay.groupby('年').var()