[pandas] 基本的な操作
Posted on 2019/03/06 in programming , Updated on: 2019/04/01
はじめに
高度な機械学習用のデータ分析などに利用されているpandasですが、 直感的で簡単にデータを操作できるため、高度な利用だけでなく、 日々のエクセルやcsvファイル操作に代用できる。
また、時系列データの操作にも強く、株価データからもちろんディープラーニングまで幅広く用いられており、 データサイエンスには必須のライブラリとなっている。
データ操作の学習には、jupyter notebookを利用することをお勧めします。
Qiita:データサイエンティストに向けたコーディング環境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)
# Index(['column1', 'column2', 'column3'], dtype='object')
# リストを返す
print(df.columns.values)
# ['column1', 'column2', 'column3']
行名が欲しい場合は、"columns"を"index"にする。
※ Headerがない(列名が無いファイル)を読み込む際は、引数header=Noneを追加すると列名にも自動で、0,1,2,..と付与される。
pd.read_csv('test.csv', header=None)
日本語が含まれるcsvを読み込む
df = pd.read_csv('include_japanese.csv', encoding='SHIFT-JIS')
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下から指定行数分取り出す
.head()
、.tail()
を使って行数を引数として渡す。行数を指定しなければ、デフォルトで5行分表示される。
# 上から2行分
df.head(2)
# 下から2行分
df.tail(2)
データフレームの行数、列数を確認する
.shape
を使う。結果はタプル型で(行数、列数)返ってくる。
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'})
df
# 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()
データをソートする
列名を指定して、降順/昇順を ascending=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()