pandas入門：最初に覚えておきたい基礎知識

pandasは覚える操作が多いので、とりあえずこれだけは覚えておきたい！という内容を個人的にまとめました。

これからpandasに触れようとしている人は是非参考にしてみてください。

# Series・DataFrame・Panel

- **Series(シリーズ)**：1次元のデータを表すものです。
- **DataFrame(データフレーム)**：2次元のデータを表すものです。
- **Panel(パネル)**：3次元のデータを表すものです。

数学で言うところのベクトルがSeries、行列がDataFrameという感じでしょうか。

プログラムにpd.DataFrame()とあったら「二次元のデータを作ってるんだなあ」って解釈できます。

# 生成の基本操作

importは次のように行います。

```test.py
import pandas as pd
```

以下のコードはすべて、import pandas as pdを省略してありますが、インポートされているものだと思ってください。

では、まずはSeriesの作成をしてみましょう。

```test.py
cp = [100,200,300,400]
print(pd.Series(cp))
# 0    100
# 1    200
# 2    300
# 3    400
# dtype: int64
```

リストと違って、出力するとインデックスが自動で付加されていますね。
このインデックスは、自分で定義することもできます。

```test.py
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を作成します。

```test.py
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で定義してます。

また、次のようにしても大丈夫です。

```test.py
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ファイルからデータを読み込む方法を紹介します。

```sample.csv
,a,b
Jan,400,100
Feb,300,200
Mar,200,300
Apr,100,400
```

csvファイルを読み込むにはread_csv()を使います。

```test.py
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行抽出したい場合

```test.py
print(df.head(3))
#        a    b
# Jan  400  100
# Feb  300  200
# Mar  200  300
```
↓カラムを指定して抽出

```test.py
print(df["a"])
# Jan    400
# Feb    300
# Mar    200
# Apr    100
# Name: a, dtype: int64
```

↓インデックスをスライスで指定して抽出

```test.py
print(df[1:3])
#        a    b
# Feb  300  200
# Mar  200  300
```

## loc, iloc, ixの違い

DataFrameから抽出をする際、良く使われるのはloc,iloc,ixです。どれも「行や列を指定して抽出する」という機能は同じです。

では、何が違うのでしょうか。

### loc

locは行、列を**ラベル名**で指定します。

```test.py
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は行、列を**番号**で指定します。

```test.py
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を使い分けるのが良さそうです。

# その他、使いそうな処理

個人的に良く使われそうな処理をいくつかまとめておきます。

```test.py
#条件指定して、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初心者なので、これから勉強頑張ります・・・。