日々更新していく予定。完全に自分用です。
ds100本ノックよりまとめ
問40まで
追加したい事
特定のディレクトリのファイル全てに対して処理
"string".formatよりf"string"の方が見やすい
【重要】実行忘れ事故が起きるので、関数化して処理をする。
#雛形
'''
処理内容や、処理方針等のメモ
'''
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()に関してはこちら
#列に対して、値の変更を行いたいとき
# id等に変更をかける場合はstringにしておくと無難
df["column"].astype(str).str.strip().apply(関数)
#行の絞り込み条件の書き方
df["boolean"] #&,|,~のみ
or
df.query('boolean') # and,or,notもok
#変数は@変数で使える
#複数段columnsの構成
columns = [("column","column"), ("column","column"), ("column","")...]
#1段に変更
df.columns = ["_".join(pair) for pair in df.columns]
#魔法のコマンド
何か処理を掛ける前に、落ち着いてデータを眺めてみよう
df["column"].value_counts()
df["column"].apply(lambda x: xに関する処理).value_counts()
#len,type,str,find,etc...
df.dtypes
#知識編
##先頭(後方)からxx行選択
df.head(int(xx))
df.tail(int(xx))
##指定のカラム列のみを抽出
df[[column1,column2, ...]]
##カラム名の変更
#いくつか
df.rename(columns=dict)
#全部
df.columns = [column1, columns2, ...]
##値の先頭がxx
df[df['column'].str.startswith("xx")]
df.query('column.str.startswith("xx")',engine="python")
##値の末尾がxx
df[df['column'].str.endswith("xx")]
df.query('column.str.endswith("xx")',engine="python")
##値にxx(正規表現も可)を含む
df[df['column'].str.contains("xx")]
df.query('column.str.contains("xx")',engine="python")
##ソートする
df.sort_values(by="column", ascending=True)
##ランキング付与する
df["column"].rank(method="min", ascending=False)
##件数のカウント
df.shape
len(df)
df.count() #not NaN
##ユニーク件数のカウント
df.nunique()
#特定のcolumnに対しても可
df["column"].nunique()
len(df["column"].unique())
##columnごとに集計する
#先頭列がindexになってしまうので、reset_index()をする
#nanが含まれる場合は集計方法にnp.xxxを使うとエラーにならない
df.groupby("column").agg({"column":[集計方法1,集計方法2,...],"column":集計方法,...}).reset_index()
df.groupby('column1').column2.集計().reset_index()
##パーセントタイル
np.percentile(df["column"], q=[0~100])
#例 q=[25, 50, 75,100]
df.columns.quantile(0~1)
#例 q=np.arange(5)/4
##df同士のマージ
pd.merge(df1, df2, how='left', on='column')
#on=listも可。詳細はリンク先
##重複行を抽出
df[df.duplicated(subset=['column1', 'column2', ...], keep=False)]
#keepが曲者。詳しくはリンク先
##重複行を削除
df[~df.duplicated(subset=['column1', 'column2', ...])]
#同じ挙動
df.drop_duplicates(subset=['column1', 'column2', ...])
##指定の値を含む行の抽出
targe_list = [volume1, volume2, ...]
df[df["column"]isin(targe_list)]
#query_ver
df.('column in targe_list ')
##指定の条件以外でエラーを出す
条件を満たしていないとエラー
assert 条件, "エラー時に出力される文章"
##指定の日時で抽出する
#編集中
import datetime as dt
df[(df["date_column"] >= dt.datetime(%Y,%m,%e)) & (df["date_column"] < dt.datetime(%Y,%m,%e))]
#実践編
##グループごとの最頻値
df.groupby('column1').column2.apply(lambda x: x.mode()).reset_index()
##valueの先頭(末尾)x文字削除
df["column"].astype(str).str.strip().apply(lambda x: x[:])#astype(int)
#strip()をかませるのがみそ
##dfのユニーク列検索
非会員等を特定の値にしている場合は漏れる(非会員値がダブりまくる)ので注意!
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)
##重複行の発見
#編集中
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])```
#リンク:データサイエンス100本ノック
環境構築に関しては、良い記事が沢山あるので調べてみて下さい!
colaboratoryでも動かせたはず...