pandasのよく使う書き方

# はじめに
pythonを使ってデータを分析したり、機械学習を行うときにpandasはよく使うが新しいプロジェクトのたびに使い方を忘れるため備忘録として記録

この記事を書くにあたって一部scikit-learnの[ワインのデータセット](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_wine.html)を使用しました。

# 前準備
```main.py
from sklearn.datasets import load_wine
import pandas as pd

wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
```

# データの概要を確認
### info()
データの数やコラム、null値があるかの確認、データのタイプを確認することができる

```main.py
df.info()
```

出力結果は以下の通り

```
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 178 entries, 0 to 177
Data columns (total 13 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   alcohol                       178 non-null    float64
 1   malic_acid                    178 non-null    float64
 2   ash                           178 non-null    float64
 3   alcalinity_of_ash             178 non-null    float64
 4   magnesium                     178 non-null    float64
 5   total_phenols                 178 non-null    float64
 6   flavanoids                    178 non-null    float64
 7   nonflavanoid_phenols          178 non-null    float64
 8   proanthocyanins               178 non-null    float64
 9   color_intensity               178 non-null    float64
 10  hue                           178 non-null    float64
 11  od280/od315_of_diluted_wines  178 non-null    float64
 12  proline                       178 non-null    float64
dtypes: float64(13)
memory usage: 18.2 KB
```

### describe()
各コラムの色々な統計量を表示してくれます。引数に何も指定しない場合、数値データの統計量を、上から

- count(データの個数)
- mean(平均値)
- std(標準偏差)
- min(最低値)
- 25%(第一四分位数)
- 50%(中央値)
- 75%(第三四分位数)

で表示してくれます。

```main.py
df.describe()
```

出力結果は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598584/20a0f5a4-68bb-5bc5-ac19-358fdbe6af5a.png)

また、引数に大文字の'O'を指定する場合、strのようなオブジェクト型のデータを上から、

- データ数(count)
- 重複のないデータ数(unique)
- 最頻出データ(top)
- 最頻出データの個数(freq)

で表示してくれます。

```main.py
df.describe(include=['O'])
```

が、このデータにはオブジェクトデータがなかったので出力はありませんでした。

また、

```main.py
df.describe(include='all')
```

とすることで、数値データとオブジェクトデータの両方を表示することができます。

### head()

Dataframeの頭から5件のデータをそのまま表示することができます。

```main.py
df.head()
```

出力結果は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598584/a7d593e9-5a54-4432-b5c0-988eadb37ce6.png)

また、引数に任意の整数を入れることで、その件数分表示することができます。

```main.py
df.head(20)
```

### tail()
Dataframeの尻尾から5件のデータをそのまま表示することができます。

```main.py
df.tail()
```

出力結果は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598584/ad886e7f-5ece-c633-823e-6acfcc7f299c.png)

また、引数に任意の整数を入れることで、その件数分表示することができます。

```main.py
df.tail(20)
```

# Dataframeの作成

### ListからDataframeへの変換

```main.py
df_list = ['apple', 'orange', 'banana']
df = pd.DataFrame(df_list)
```

出力結果は以下の通り

```
        0
0   apple
1  orange
2  banana
```

また、行名や列名を指定することも可能

```main.py
df_list = ['apple', 'orange', 'banana']
df = pd.DataFrame(df_list, index=['id_1', 'id_2', 'id_3'], columns=['fruit'])
```

出力結果は以下の通り

```
       fruit
id_1   apple
id_2  orange
id_3  banana
```

2次元配列も同様に

```main.py
df_list = [['apple', 'orange', 'banana'], ['tomato', 'carrot', 'lettuce']]
df = pd.DataFrame(df_list, index=['id_1', 'id_2'], columns=['column_1','column_2','column_3'])
```

出力は

```
     column_1 column_2 column_3
id_1    apple   orange   banana
id_2   carrot   tomato  lettuce
```

逆にしたいなら

```main.py
df.T
```

もしくはlistを分け直して

```main.py
df_fruit = ['apple', 'orange', 'banana'] 
df_vegetable = ['tomato', 'carrot', 'lettuce']
df = pd.DataFrame(list(zip(df_fruit, df_vegetable)), index=['id_1', 'id_2','id_3'], columns=['fruit','vegetable'])
```

でこの結果が得られる

```
       fruit vegetable
id_1   apple    tomato
id_2  orange    carrot
id_3  banana   lettuce
```

### Dict型からDataframeへの変換

```main.py
df_dict = {'fruit':['apple', 'orange', 'banana'], 'vegetable': ['tomato', 'carrot',  'lettuce']}
df = pd.DataFrame.from_dict(df_dict)
```

で出力が

```
    fruit vegetable
0   apple    tomato
1  orange    carrot
2  banana   lettuce
```

### csvファイルからDataframeへの変換
```food.csv
fruit,vegetable
apple,tomato
orange,carrot
banana,lettuce
```

```main.py
df = pd.read_csv('food.csv')
```

で出力が

```
    fruit vegetable
0   apple    tomato
1  orange    carrot
2  banana   lettuce
```

# Dataframeの行列の操作
### 列の抽出
#### 特定の1列の抽出

```main.py
df['fruit']

# こっちでも可能
df.fruit
```

で出力が

```
0     apple
1    orange
2    banana
Name: fruit, dtype: object
```

また、for文などで一つづつ取り出すことも可能

```main.py
fruit = df['fruit']
for i in fruit:
    print(i)
```

出力

```
apple
orange
banana

```

#### 複数列の抽出

```main.py
df.loc[:,['fruit', 'vegetable']]
```
出力

```
    fruit vegetable
0   apple    carrot
1  orange    tomato
2  banana   lettuce
```

### 特定の行、列の抽出
このようなdfを仮定する

|name|money |sex|
|:-----------|:------------:|:------------:|
|jon|  100         |male|
|bob|350       |male|
|sara|200         |female|

####　単一条件の指定

```main.py
df[df['money']>150]
```

出力は

```
   name  money      sex
1   bob    350     male
2  sara    200   female
```

#### 複数条件の指定
##### AND

```main.py
df[(df['money']>150) & (df['sex'] == 'male')]
```

出力は

```
  name  money   sex
1  bob    350  male
```

##### OR

```main.py
df[(df['money']>150) | (df['sex'] == 'male')]
```

出力は

```
   name  money     sex
0   jon    100    male
1   bob    350    male
2  sara    200  female
```

##### NOT

```main.py
df[~(df['sex'] == 'male')]
```

出力は

```
   name  money     sex
2  sara    200  female
```

### 新規行の追加

```main.py
power = [100,20,500]
df['power'] = power
```

出力は

```
   name  money     sex  power
0   jon    100    male    100
1   bob    350    male     20
2  sara    200  female    500
```

# まとめ
わからないことがあったらまた増えます。

# 参考URL
参考にしたサイト様です。大変ありがとうございます。

https://qiita.com/0NE_shoT_/items/bf700662b2c36aee0f8e#describe

https://qiita.com/hi34/items/43c366dea18b46faf49d

https://note.nkmk.me/python-pandas-multiple-conditions/

https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA