[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()