pandas操作

2021.3.18 直接のdf作成・取得などを追記

# 直接df
```python
df = pd.DataFrame({
    "col1" : [1,2,3,4,5],
    "col2" : [6,7,8,9,10],
    "col3" : ["A","B","C","D","E"]
})

```
![スクリーンショット 2021-03-18 22.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/37785050-63dc-65f8-ab81-5726269cdc65.png)

```python
# 同じデータフレームをnumpyのarrayを使って作成
import numpy as np
array1 = np.array([1,2,3,4,5])
array2 = np.array([6,7,8,9,10])

df = pd.DataFrame({
    "col1" : array1,
    "col2" : array2,
    "col3" : ["A","B","C","D","E"]
})
```
# dictからdf
```python
df = pd.DataFrame(dict_data.values(), index=dict_data.keys())
# 初期のcolumn名が0になるので変更
df = df.rename(columns={0:"count"})
```


# 名称変更
## column名の変更(rename)
```python
df = df.rename(columns={"before1":"after1","before2": "after2"})
```

# 取得
列名からデータを取得する  

```python
df.y
```
![スクリーンショット 2021-03-18 22.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/402c0337-ee61-9b48-5a0a-349090e489be.png)

```python
df["y"]
```
![スクリーンショット 2021-03-18 22.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/3c226dff-d37f-2312-4388-f07dc33b434e.png)

```python
df[["y"]]
```
![スクリーンショット 2021-03-18 22.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/23bab82e-c995-6370-2eff-09cdda9e0657.png)

# 複数取得
行列で取得することになる

```python
df[["column1","column2"]]
```
![スクリーンショット 2021-03-18 22.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/1fe87ffe-4a5f-bc1a-428f-3707061cd352.png)

# [   ]と型
## df[　　]
```python
type(df["y"])
# pandas.core.series.Series
```
## df[[　　]]
```python
type(df[["y"]])
# pandas.core.frame.DataFrame
```

seriesで取得しておくとnumpyのarrayと同様に扱うことができる。

# seriesをnp.arrayに変換する
```python
import numpy as np
np.array(df.column1)

# .values としても変換可能
df.column1.values
```

# 行の取得
query関数を使う。  

```python
# 0行目を取得
df.query("index == 0")

# query で条件を指定して抽出
df.query("category2 == 'married'")

# queryでorで条件指定して抽出
df.query("category2 == 'married'| category2 == 'single'")

# query関数でandで条件指定して抽出
df.query("category2 == 'married'& y == 'yes'")

# 行に条件付与した上で抽出列を指定
df.query("category2 == 'married'")[["column2","y"]]
```




# 削除
## 欠損値を含む行の削除(dropna)
```python
# category1、category3 に欠損値を含む行を削除
df = df.dropna(subset=['category1','category3'])
```
## 列の欠損数を指定して削除(dropna)
```python
# 欠損数が2400個以上のcolumnを除外
df = df.dropna(thresh=2400, axis=1)
```
## 列(columns)の削除(drop)
```python
df = df.drop(columns="column5")
```

# 補完
## カテゴリーデータの補完(fillna)
```python
# 欠損値を「unknown」で置換
df = df.fillna({'category1':'unknown'})

# 欠損値を最頻のカテゴリーで補完
df['category1'] = df['category1'].fillna(df['category1'].mode()[0])

# 2番目に頻出で埋めたい場合があれば .mode()[1]
```

## 量的変数の補完(fillna)
```python
#平均値で埋める
df['column1'] = df['column1'].fillna(df['column1'].mean())
```
# 除外
```python
# column1について 18以下、100以上を外れ値としたい。
# dfのcolumn1 18以上を抽出
df = df[df["column1"] >= 18]
# dfのcolumn1 100以下を抽出
df = df[df["column1"] <= 100]

# 絞り込むことで除外を実現する
# df[抽出条件]
```
# データ変換

## 条件置換(where)
```python
df = pd.DataFrame({
    "col1" : [1,2,3,4,5],
    "col2" : [6,7,8,9,10],
    "col3" : [0,20,50,0,0]
})

df

# col3に対して 0以外を1にしたい
# Trueは放置、Falseに対して指定の置換
df["col3"] = df['col3'].where(df['col3'] == 0, 1)
df
```


## 2値分類の変換(replace)
```python
# 本当に2値分類か確認
print(df["category5"].value_counts(ascending=False, normalize=False))

# 特定の列に対して、2値(yes/no)の変換
df["category5"] = df["category5"].replace("yes",1)
df["category5"] = df["category5"].replace("no",0)
```

```python
# yes/no 項目が複数なら一括変換も可能
df = df.replace("yes", 1)
df = df.replace("no", 0)
```
## 多値分類の変換(pd.get_dummies)
```python
# 本当に多値分類か確認
print(df["category2"].value_counts(ascending=False, normalize=False))

# dummy変数を使って変換する
df_category2 = pd.get_dummies(df['category2'])

# 先頭から5行目まで表示
df_category2.head()

# category2 1列　から vfalue_countsの数分の列が作成される
```

![スクリーンショット 2021-02-08 19.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/b92d0e73-2feb-2a3d-510f-d04b491013e6.png)

変換後に結合が必要になる。

# 結合(concat)
column1~3,category5 + category2(dummy) + y

```python
# column1,column2,column3,category5を抽出
tmp1 = df[["column1","column2","column3","category5"]]


# category2のダミー変数変換
df_category2 = pd.get_dummies(df['category2'])

# 結合
# new_df = column1~3,category5 + category2
new_df = pd.concat([tmp1, df_category2],axis=1)

# 右端にyを結合
new_df = pd.concat([new_df, df[["y"]]],axis=1)
```

# 書き出し
```python
# 新しいdfをCSVファイルで出力
new_df.to_csv('file_name.csv', index=False)
```

# カウント(value_counts)
```python
# category2の値の比率を計算
df['category2'].value_counts(ascending=False, normalize=True)


# ascending ascending True:昇順 / False:降順
# normalize True:割合 / False:頻度
```

# 並び替え(sort_values)
```python
df = df.sort_values("category2", ascending = False)
# ascending ascending True:昇順 / False:降順
```
量的データでもカテゴリーデータでも並び替えは可能

# 転置(.T)
```python
df.T
```

# クロステーブル

## その1
```python
df = pd.DataFrame({
    "smoke" : [0,0,0,1,1,1,1],
    "lung" : [0,0,1,0,1,1,1],
})

df
```
![スクリーンショット 2021-07-10 17.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/73ff85aa-a7ea-e850-4a18-39a1b298d7c4.png)


```python
pd.crosstab(df['smoke'], df['lung'])
```

![スクリーンショット 2021-07-10 17.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/94c1e925-a0c3-a057-4fef-4a0937a2fea2.png)

## その2
IDに対して重複なしで複数属性持つ時にはダミー変換も兼ねた使い方ができる

```python
df = pd.DataFrame({
    "ID" : [1,2,2,2,3,4,4],
    "attribute" : ["B","C","D","B","A","A","C"],
})

df
```
![スクリーンショット 2021-07-10 17.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/e92589f1-f721-9f9a-8656-996a015859b3.png)



```python
pd.crosstab(df['ID'], df['attribute'])
```

![スクリーンショット 2021-07-10 17.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/b29d2a99-38e2-1843-8012-d98db03d4950.png)