pandasは覚える操作が多いので、とりあえずこれだけは覚えておきたい!という内容を個人的にまとめました。
これからpandasに触れようとしている人は是非参考にしてみてください。
Series・DataFrame・Panel
- Series(シリーズ):1次元のデータを表すものです。
- DataFrame(データフレーム):2次元のデータを表すものです。
- Panel(パネル):3次元のデータを表すものです。
数学で言うところのベクトルがSeries、行列がDataFrameという感じでしょうか。
プログラムにpd.DataFrame()とあったら「二次元のデータを作ってるんだなあ」って解釈できます。
生成の基本操作
importは次のように行います。
import pandas as pd
以下のコードはすべて、import pandas as pdを省略してありますが、インポートされているものだと思ってください。
では、まずはSeriesの作成をしてみましょう。
cp = [100,200,300,400]
print(pd.Series(cp))
# 0 100
# 1 200
# 2 300
# 3 400
# dtype: int64
リストと違って、出力するとインデックスが自動で付加されていますね。
このインデックスは、自分で定義することもできます。
cp = [100,200,300,400]
cp_index = ["Jan","Feb","Mar","Apr"]
print(pd.Series(cp, index=cp_index))
# Jan 100
# Feb 200
# Mar 300
# Apr 400
# dtype: int64
次に、DataFrameを作成します。
cp = {
"a": [400,300,200,100],
"b": [100,200,300,400]
}
cp_index = ["Jan","Feb","Mar","Apr"]
print(pd.DataFrame(cp, index=cp_index))
# a b
# Jan 400 100
# Feb 300 200
# Mar 200 300
# Apr 100 400
DataFrameはExcelとかでよく見る表の形になりましたね。
DataFrameでは、インデックスだけでなくカラム(aとb)も指定しております。
そのため、変数cpはdictionaryで定義してます。
また、次のようにしても大丈夫です。
df=pd.DataFrame([[400,100],
[300,200],
[200,300],
[100,400]],
index=['Jan', 'Feb','Mar','Apr'],
columns=["a","b"])
print(df)
# a b
# Jan 400 100
# Feb 300 200
# Mar 200 300
# Apr 100 400
とは言え、実際は自分でデータを書き込むのではなく、csvファイルを読み込むことが多いでしょう。
ということで、csvファイルからデータを読み込む方法を紹介します。
,a,b
Jan,400,100
Feb,300,200
Mar,200,300
Apr,100,400
csvファイルを読み込むにはread_csv()を使います。
df=pd.read_csv("sample.csv",index_col=[0])
print(df)
# a b
# Jan 400 100
# Feb 300 200
# Mar 200 300
# Apr 100 400
index_colでは、何列目をインデックスにするかをリスト型で指定します。
抽出の基本操作
以下のソースコードでは、dfは上と同じものを使います。
↓上から3行抽出したい場合
print(df.head(3))
# a b
# Jan 400 100
# Feb 300 200
# Mar 200 300
↓カラムを指定して抽出
print(df["a"])
# Jan 400
# Feb 300
# Mar 200
# Apr 100
# Name: a, dtype: int64
↓インデックスをスライスで指定して抽出
print(df[1:3])
# a b
# Feb 300 200
# Mar 200 300
loc, iloc, ixの違い
DataFrameから抽出をする際、良く使われるのはloc,iloc,ixです。どれも「行や列を指定して抽出する」という機能は同じです。
では、何が違うのでしょうか。
loc
locは行、列をラベル名で指定します。
print(df.loc[["Feb","Mar"]])
# a b
# Feb 300 200
# Mar 200 300
print(df.loc[:,["a"]])
# a
# Jan 400
# Feb 300
# Mar 200
# Apr 100
ちなみに、df.loc[ : ,["a"]]のコロンは、「行はすべて抽出」を意味します。
iloc
ilocは行、列を番号で指定します。
print(df.iloc[[1,3]])
# a b
# Feb 300 200
# Apr 100 400
print(df.iloc[:,[0]])
# a
# Jan 400
# Feb 300
# Mar 200
# Apr 100
print(df.iloc[[1,3],[0]])
# a
# Feb 300
# Apr 100
print(df.iloc[1:3])
# a b
# Feb 300 200
# Mar 200 300
ilocのiはinteger(整数)のiなんですかね。
ix
ixは行、列をラベル名で指定しても良いし、番号で指定しても大丈夫です。
しかし、インデックスやカラムが整数型だったら混同が起きてややこしくなるので、ixは使わずにlocとilocを使い分けるのが良さそうです。
その他、使いそうな処理
個人的に良く使われそうな処理をいくつかまとめておきます。
#条件指定して、DataFrameの中身をTrueとFalseにする
print(df >= 300)
# a b
# Jan True False
# Feb True False
# Mar False True
# Apr False True
#300未満の数値をNaNにする
print(df[df >= 300])
# a b
# Jan 400 NaN
# Feb 300 NaN
# Mar NaN 300
# Apr NaN 400
#欠損値NaNを0で埋める
print(df[df >= 300].fillna(0))
# a b
# Jan 400 0
# Feb 300 0
# Mar 0 300
# Apr 0 400
#欠損値NaNをカラムごとの平均値で保管する
print(df[df >= 300].fillna(df.mean()))
# a b
# Jan 400 250
# Feb 300 250
# Mar 250 300
# Apr 250 400
終わりに
本格的な勉強の前に、まずはこれだけ!というのをまとめました。
これを覚えてやっとスタート地点に立てたという感じだと思います。
僕もpandas初心者なので、これから勉強頑張ります・・・。