Pandas

# Series

# DataFrame

例として、機械学習の入門書でよく使用される iris データセットを使用する。

```python
import pandas as pd
df = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data", header=None, encoding='utf-8')
```

## 行名・列名の変更

行方向はインデックス`index`、列方向は`columns`で指定できる。

```python
df.set_axis(['Row1', 'Row2', 'Row3'], axis=0)          # 行名を一括で変更 (行数と引数の要素数は合わせましょう）
df.set_axis(['Row1', 'Row2', 'Row3'], axis='index')    # 行名を一括で変更
df.set_axis(['A', 'B', 'C', 'D', 'E'], axis=1)         # 列名を一括で変更 (列数と引数の要素数は合わせましょう）
df.set_axis(['A', 'B', 'C', 'D', 'E'], axis='columns') # 列名を一括で変更
```

デフォルトではデータフレームは修正されないので：

```python
df.set_axis(['A', 'B', 'C', 'D', 'E'], axis=1, inplace=True) 
```

また上記の方法とは別に、

```python
df.index = ... # 何らかのtupleを渡すことができる
df.columns = ['A', 'B', 'C', 'D', 'E'] 
```

でも修正できる。この場合は元の DataFrame も修正される。


## 1行ずつ解析

```python
# (1)
for index, row in df.iterrows():
    # index : インデックスの数字
    # row : pandas.Series

# (2)
for row in df.itertuples():
    # row : pandas.core.frame.Pandas

# (3)
for row in df.itertuples(name=None):
    # row : 通常の tuple
    # ex. 0列目の値を参照する
    print(row[0]) 
```

## 要素にアクセスする

```python
df.head() # 冒頭の表示、引数に数字を入れることでprintする行数を指定できる
df.tail() # 末尾の表示、<同上>
```

簡単な`DataFrame`に対して解説する（6行4列、要素は乱数で初期化された値）

```python
import numpy as np
np.random.seed(123)
df_rnd = pd.DataFrame(
    np.random.randn(6,4), 
    index=['R-0', 'R-1', 'R-2', 'R-3', 'R-4', 'R-5'],
    columns=['C-0', 'C-1', 'C-2', 'C-3'])

#           C-0       C-1       C-2       C-3
# R-0 -1.085631  0.997345  0.282978 -1.506295
# R-1 -0.578600  1.651437 -2.426679 -0.428913
# R-2  1.265936 -0.866740 -0.678886 -0.094709
# R-3  1.491390 -0.638902 -0.443982 -0.434351
# R-4  2.205930  2.186786  1.004054  0.386186
# R-5  0.737369  1.490732 -0.935834  1.175829
```

```python
# 行の情報を持ってくる
df_rnd.loc["R-0"]  # 行ラベルでアクセスする
df_rnd.iloc[0]     # index番号でアクセスする（ラベル名でのアクセスと同じ結果）
# 複数行の情報を持ってくる
df_rnd.loc[['R-0', 'R-1']] 
df_rnd.loc[0:2]

# 列の情報を持ってくる
df_rnd.loc[:, "C-0"] # 列ラベルでアクセスする
df_rnd.iloc[:, 0]    # 列インデックスでアクセス（2人のageを持ってこれる）
```


# 基本的な使い方

## リストからDFを作成
リストを用意して、それを用いてDataFrameを初期化すると簡単に作成することができる。

```python
>>> import pandas as pd
>>> list = [["2020/01/01", "12:30", "Yamada", "寝た"], ["2020/01/02", "13:30", "Tanaka", "帰省した"]]
>>> pd.DataFrame(data=list)
            0      1       2     3
0  2020/01/01  12:30  Yamada    寝た
1  2020/01/02  13:30  Tanaka  帰省した

>>> pd.DataFrame(data=list, index=["A","B"], columns=["日付", "時間", "名前", "行動"])
           日付     時間      名前    行動
A  2020/01/01  12:30  Yamada    寝た
B  2020/01/02  13:30  Tanaka  帰省した
```

## DataFrameからSeries
DataFrameのいち部分を切り取ると、Seriesが返ってくる。

```python
>>> list = ["a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b", "c", "c"]
>>> df = pd.DataFrame(list)
>>> type(df)
<class 'pandas.core.frame.DataFrame'>
>>> type(df[0])
<class 'pandas.core.series.Series'>
```

# テクニック
以下のデータフレームは

```python
list = [['', '', '']]
df = pd.DataFrame()
```


## 要素を数える
### value_counts()

```
# DataFrame 
df = pd.read_csv("input.csv")
```

```
df.loc[0] // 0行目の取得
df.["列名"] // 指定したcolumn(=列)の値の取得
df.at[0,1] // 0行1列目のデータを取得
df.at[0,"列名"] // 0行目
```

```
len(df) 行数
len(df.columns) 列数
```

##　削除
### drop

```python
df.drop(columns='カラム名', axis=1) #行なら1
```


##　抽出
```python
df[ df['year'].str.contains('2020')]
```