Pandasでデータ操作！

# はじめに
社内開発タスクでpandasを使う機会が何度かあったのですが、
そんなに頻繁でもないのであれどうやるんだっけとか、
そもそもどうやるんだっけとかが多いです。
また、性質上数GBのデータを扱う機会が多いので、
そういった場合にも対応できるような方法を随時更新していこうと思います。
そのため、構成としてはやりたいこと⇒やりかたといった形で記載します。

ちなみにゴリゴリ機械学習をやってるとかではないため、
その辺の話はでてきませんのでご了承ください。


# csvの読み込み
そもそもcsvを読み込めないと何にもできません。
ので読み込み方から。
基本は以下で大丈夫。

```python

df = pd.read_csv("ファイル名")
```

### 大容量ファイルの読み込み
ただ、ファイルサイズがGBの世界になってくると、
メモリに乗り切らないといった可能性が上がってきます。
そういった場合にはchunksizeオプションをつけて分割して読み込みしてあげましょう。

なお、chunksizeを指定した場合、
Dataframeではなく、TextFileReader インスタンスというもので読み込まれます。
TextFileReaderはループで回してあげれば、DataFrameを取り出すことが可能。
以下の例でいくと50行ずつ取り出してPrintされる。

```python

data = pd.read_csv("test.csv", chunksize=50)
for i in data:
  print(i)
```

##### オプション
| オプション名 | 意味 | 例 |
|:-----------------:|:------------------:|:------------------:|
| encoding | 文字コードの指定 | encoding='UTF-8' |
| skiprows | 読み飛ばす行を指定 | skiprows=2 |
| chunksize | 指定した行数毎に読み込み | chunksize=50 |
| usecols | 指定した列のみ読み込み | usecols=[1, 3] |


 [その他オプション](https://own-search-and-study.xyz/2015/09/03/pandas%E3%81%AEread_csv%E3%81%AE%E5%85%A8%E5%BC%95%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99/)

# 2データの連結
別々のファイルをそれぞれ読み込んで連結する方法

```python

# ファイル１読み込み
Data1 = pd.read_csv(file1, dtype = np.float32)
# ファイル２読み込み
Data2 = pd.read_csv(file2, dtype = np.float32)
# 2データを連結
rawData = pd.concat([Data1, Data2], ignore_index=True)
```

# 特定の列を取得する
```python

df['A']
```

# 特定の区間の行を抽出する
```python

df[1:3]
```
行は０から始まるので、この場合１行目は取得できないので注意。
また、:3は2までの意味合いです。

# 不要なカラムの削除
inplace=Trueの指定で元のdataframeが変更される。
以下の例ではDataからCity,Priceカラムがなくなる。

```python

df.drop(columns=['City', 'Price'], axis = 1, inplace=True)
```
列番号で指定も可能

```python

df.drop(columns=[[1, 2]], axis = 1, inplace=True)
```

# 行の削除
```python

df.drop(df.index[[1, 3, 5]])
```
なお、デフォルトでは行のindexは0から連番になっているが、
sortなどをかけたあとだとindexが連番ではなくなるので注意。


# 特定カラムの置換

```python

df.replace({列名: {元の値: 置換後の値}})
```

# ある列の値でデータの分割
列の値で処理を変える場合に使う。
GroupBy オブジェクトを返してくれるため、そのままfor文でがちゃがちゃできる。

```python

for カラムの値, データフレーム in df.groupby('カラム名'):
    各処理
```
なお、indexは飛び飛びになるので、
各データフレームでindexを貼り直す場合はreset_index()を使う。
※drop=True を指定しなければ、旧インデックスがデータ列に移動するので注意。

```python
for city,sdf in  df.groupby('city'):
    sdf.reset_index(drop=True)
    if city = 'Tokyo':
             flags = 1
```


# レコード数のカウント
1列目の配列の要素数を返却。
[0]なしだと行列をそれぞれカウント。

```python

pd.shape[0]
```


# 平均
```python

means = df.mean(axis = 0) 
```

# 標準偏差
```python

std = df.std(axis = 0) 
```

# csvの保存
dataframeの加工後csvとして保存する場合は以下。

```python

df.to_csv("ファイル名")
```

| オプション名 | 意味 | 例 |
|:-----------------:|:------------------:|:------------------:|
| columns| 特定列のみ書き出し | columns=['age'] |
| header| ヘッダーの有無 | header=False |
| index| インデックスの有無 | index=False |

 [pandasでcsvファイルの書き出し・追記（to_csv）](https://note.nkmk.me/python-pandas-to-csv/)


# 参考
 [PandasとNumPyの違いと使い分け方](https://deepage.net/features/pandas-numpy.html)
 [カラムの値でDataFrameをグループ分割 - pandas](https://ikatakos.com/pot/programming/python/packages/pandas/separate_dataframe)
 [pandas.DataFrameの行・列を指定して削除するdrop](https://note.nkmk.me/python-pandas-drop/)
 [pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/)
 [DataFrame のインデックスを reset_index で振り直す－python](http://ailaby.com/reset_index/)