【自分用】pandas.DataFrameのデータ抽出あれこれ

日々更新していく予定。完全に自分用です。

ds100本ノックよりまとめ
問40まで

追加したい事
特定のディレクトリのファイル全てに対して処理

"string".formatよりf"string"の方が見やすい

**【重要】実行忘れ事故が起きるので、関数化して処理をする。**
#雛形
```python
'''
処理内容や、処理方針等のメモ
'''

import pandas as pd


def main():
    # ファイルの読み込み
    file_path = 'URL'
    df = pd.read_csv(file_path, header=0, skipfooter=0)
    #df = pd.read_excel(file_path, sheet_name=0, header=0, index_col=None)

    # 処理を記載
    df_treated = # ここに処理内容を書く

    # outoput
    output_path = "URL"
    file_type = "file_type"
    purpose = "処理内容"
    file_name = f"{file_type}_{purpose}.csv"
    df_treated[["columns"]].to_csv(output_path + file_name, index=False, encoding="utf-8-sig")


main()
```
read_excel()に関してはこちら

https://note.nkmk.me/python-pandas-read-excel/

#列に対して、値の変更を行いたいとき
```python
#　　id等に変更をかける場合はstringにしておくと無難
df["column"].astype(str).str.strip().apply(関数)
```

#行の絞り込み条件の書き方
```python
df["boolean"] #&,|,~のみ
or
df.query('boolean') # and,or,notもok
#変数は@変数で使える
```
https://note.nkmk.me/python-pandas-query/

#複数段columnsの構成
```python
columns = [("column","column"), ("column","column"), ("column","")...]
#1段に変更
df.columns = ["_".join(pair) for pair in df.columns]
```

#魔法のコマンド
何か処理を掛ける前に、落ち着いてデータを眺めてみよう

```python
df["column"].value_counts()
df["column"].apply(lambda x: xに関する処理).value_counts()
#len,type,str,find,etc...
df.dtypes
```

#知識編

##先頭（後方）からxx行選択
```python
df.head(int(xx))
df.tail(int(xx))
```

##指定のカラム列のみを抽出
```python
df[[column1,column2, ...]]
```

##カラム名の変更
```python
#いくつか
df.rename(columns=dict)
#全部
df.columns = [column1, columns2, ...]
```

##値の先頭がxx
```python
df[df['column'].str.startswith("xx")]
df.query('column.str.startswith("xx")',engine="python")
```

##値の末尾がxx
```python
df[df['column'].str.endswith("xx")]
df.query('column.str.endswith("xx")',engine="python")
```

##値にxx（正規表現も可）を含む
```python
df[df['column'].str.contains("xx")]
df.query('column.str.contains("xx")',engine="python")
```
https://murashun.jp/article/programming/regular-expression.html

##ソートする
```python
df.sort_values(by="column", ascending=True)
```

##ランキング付与する
```python
df["column"].rank(method="min", ascending=False)
```
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rank.html

##件数のカウント
```python
df.shape
len(df)
df.count() #not NaN
```

##ユニーク件数のカウント
```python
df.nunique()
#特定のcolumnに対しても可
df["column"].nunique()
len(df["column"].unique())
```

##columnごとに集計する
```python
#先頭列がindexになってしまうので、reset_index()をする
#nanが含まれる場合は集計方法にnp.xxxを使うとエラーにならない
df.groupby("column").agg({"column":[集計方法1,集計方法2,...],"column":集計方法,...}).reset_index()
df.groupby('column1').column2.集計().reset_index()
```

##パーセントタイル
```python
np.percentile(df["column"], q=[0~100])
#例 q=[25, 50, 75,100]
df.columns.quantile(0~1)
#例 q=np.arange(5)/4
```

##df同士のマージ
```python
pd.merge(df1, df2, how='left', on='column')
#on=listも可。詳細はリンク先
```
https://note.nkmk.me/python-pandas-merge-join/

##重複行を抽出
```python
df[df.duplicated(subset=['column1', 'column2', ...], keep=False)]
#keepが曲者。詳しくはリンク先
```
https://note.nkmk.me/python-pandas-duplicated-drop-duplicates/

##重複行を削除
```python
df[~df.duplicated(subset=['column1', 'column2', ...])]
#同じ挙動
df.drop_duplicates(subset=['column1', 'column2', ...])
```

##指定の値を含む行の抽出
```python
targe_list = [volume1, volume2, ...]
df[df["column"]isin(targe_list)]
#query_ver
df.('column in targe_list ')
```

##指定の条件以外でエラーを出す
条件を満たしていないとエラー

```python
assert 条件, "エラー時に出力される文章"
```
##指定の日時で抽出する
```python
#編集中
import datetime as dt

df[(df["date_column"] >= dt.datetime（%Y,%m,%e)) & (df["date_column"] < dt.datetime(%Y,%m,%e))]
```
https://python.civic-apps.com/date-format/

https://note.nkmk.me/python-pandas-datetime-timestamp/

#実践編

##グループごとの最頻値
```python
df.groupby('column1').column2.apply(lambda x: x.mode()).reset_index()
```

##valueの先頭（末尾）x文字削除
```python
df["column"].astype(str).str.strip().apply(lambda x: x[:])#astype(int)
#strip()をかませるのがみそ
```

##dfのユニーク列検索
非会員等を特定の値にしている場合は漏れる（非会員値がダブりまくる）ので注意！

```python
import pandas as pd

read_path = "URL"
df = pd.read_csv(read_path, header=0, skipfooter=0)

def unique_column_checker(df):
    unique_column_num = 0
    print("dfの行数は「{}」行です".format(df.shape[0]))
    print("{}".format("-"*20))
    for column in df.columns:
        if df.shape[0]*0.98 <= df[column].nunique():
            unique_column_num += 1
            print("カラム名「{}」はユニーク件数「{}」件です".format(column, df[column].nunique()))
    if unique_column_num == 0:
        print("残念ながらユニークなカラムはありません。作りましょう！")
unique_column_checker(df)
```

##重複行の発見
```python
#編集中

def dup_checeker(URL,target, skipheader=0, skipfooter=0):
    df = pd.read_csv(URL, header=skipheader, skipfooter=skipfooter)
    print(df[df.duplicated(subset=target, keep=False)][target])```
```


```python
```

#リンク：データサイエンス100本ノック
環境構築に関しては、良い記事が沢山あるので調べてみて下さい！
colaboratoryでも動かせたはず...

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess