pandas ワンポイントアドバイス

<h1>目的</h1>
pandasを使うときに役に立つワンポイントコードを記録するため<br>

<h3>リストインポート時に1行目をカラムにする</h3>

~~~
data=["a","b","c"]
df = pd.DataFrame(data)

df.columns = df.iloc[0]
#1行目をカラムに設定する

df = df.drop(df.index[0])
#1行目を削除する
~~~

<h3>2つのデータフレームで重複している行を削除</h3>

~~~
df_rewrite_del = df_rewrite[~df_rewrite["Page"].isin(df_del)]
df_rewrite_del

#df_delに含まれているdf_rewrite["Page"]を出してくる、という作業の逆をしている（~　の効果）
~~~

<h3>pandas のconcatのエラー対処<h3>

~~~python
pd.concat(df_other,df_iimono)
~~~
以下のエラーが出る
first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

~~~python
pd.concat([df_other,df_iimono])
~~~

<h2>pandasの結合の種類の違い</h2>
pandasでデータフレームを結合する種類は、<br>
<li>concat</li>
<li>merge</li>
<li>join</li>
の3種類

<h3>concatの使い方</h3>
concatは縦にも横にもつなげられるのが特徴<br>
ただし、[ ]で囲む必要があるのと、結合の種類を変える場合はjoin=" "が必要

~~~python
pd.concat([df1,df2])
#df1とdf2を縦につなげる
pd.concat([df1,df2],join="inner")
#縦方向に内部結合する
pd.concat([df1,df2],axis=1）
#横方向に結合する
~~~

<h3>mergeの使い方</h3>
mergeは基本的に横につなげる<br>
ただし、[ ]で囲む必要はなく、結合の種類を変える場合はhow=" "が必要<br>
横のみだが、各量が少なく多くの結合方法ができる

~~~python
df1.merge(df2)
#df1とdf2を横につなげる。この際は共通する列名をキーとして結合。内部結合
pd.merge(df1,df2,on="shop")
#shopというカラムを軸にして結合
pd.merge(df1,df2,how="right")
#右結合
~~~

<h3>joinの使い方</h3>
joinは基本的に横につなげる<br>
インデックスを軸に横結合をするのが特徴。そのため3種類以上のdataFrameも結合可能

~~~python
df1.join(df2)
#df1とdf2を横につなげる。Indexをキーとして結合。内部結合
~~~

また、まれに<br>
columns overlap but no suffix specified <br>
というエラーが出ることがある。<br>
<br>
この原因は結合するdfに同じカラム名がある場合に起こっているから起こる現象。だから、この場合は、左右少なくともどちらかの接尾語を指定する必要があります。

<li>lsuffix="df1の接尾語"</li>
<li>rsuffix="df2の接尾語"</li>

<h2>文字列の中から特定の文字が入っているか判定</h2>
判定をするときにはinを使って判定を行う。

~~~python
response = requests.get(url)
soup = BeautifulSoup(response.text,"html.parser")
sentence = soup.get_text().replace("\n","")

for let in sentence.split("。"): 
    if "コーヒー" in let:
    #ただし、"判定したい文字" in "判定元の文"となることに注意
        print(let)
    else:
        pass
~~~

https://pg-chain.com/python-in#google_vignette


<h2>groupby関数でグループ分け</h2>
年月で料金をグループ分けしたいときには、groupby()関数を使うとよい

~~~python
join_data.groupby(["payment_month","item_name"]).sum()[["price","quantity"]]
#join_dataをpayment_monthとitem_nameでグループ分けして、priceとquantityの合計値を表す
~~~

参考）Python実践データ分析100本ノック　第1章

<h2>時系列データの変換</h2>
まずはpd.to_datetimeで時系列データへ変換をする<br>
次に時系列データを特定の形式へ変換するには、dt.strftime("")を使う

~~~python
join_data["payment_date"] = pd.to_datetime(join_data["payment_date"])
join_data["payment_month"] = join_data["payment_date"].dt.strftime("%Y%m")
join_data[["payment_date","payment_month"]]
#join_dataのpayment_dateを月日に変換する
~~~

参考）Python実践データ分析100本ノック　第1章

<h2>ピボットテーブルの作成</h2>
まずはpd.pivot_tableでピボットテーブルの作成が可能<br>
index/columnsでそれぞれの行列に入る要素を入力できる

~~~python
pd.pivot_table(join_data,index="item_name",columns="payment_month",values=["price","quantity"],aggfunc="sum")
#indexがitem_name、columnsがpayment_month、集計する値が["price","quantity"]、集計方法（aggfunc）が合計（sum）
~~~

参考）Python実践データ分析100本ノック　第1章

<h2>特定の条件を満たす行をリストアップする</h2>
colを使うとよい<br>
colは特定の条件に合う行や列をリストアップできるものである

~~~python
flg_is_null = uriage["item_price"].isnull()
uriage.loc[flg_is_null,"item_name"]
#flg_is_nullはnullになっているものをTrueにするもの。それがTrueになっている行の「item_name」をリストアップする関数
~~~

参考）Python実践データ分析100本ノック　第2章

<h2>特定のカラムを外したdataframeを作る方法</h2>

列のtrue/falseの判定を行い、そこからtrainへ反映させる
~~~python
x_train = train[train.columns[train.columns!="Survived"]]
#trainのdfから"Survived"の名前の列が付いたものか否かを判定し、Trueだった場合のカラム列を作る。そのカラム列のdfを作る
~~~

<h2>pandasで特定の列だけ除外したdfを作る</h2>

~~~python
df[df.columns[df.columns != 'b']]
#dfのリストの"b"の列以外を残したdfを作る方法
~~~
参考）https://qiita.com/ophhdn/items/2e88814cc23c8d62b12c


<h2>trueになっているものを残し、falseの場合はNaNへ変換</h2>
.whereを使う

~~~python
data["Family_name_size"] = data["Family_name_size"].where(data["Family_name_size"].isin(fami))
# つまり df.where(data)でかける
~~~

<h2>pandasの2つの列を結合させる</h2>

〇〇.str.cat（××）で結合できる
~~~python
data["Family_name"].str.cat(data["familysize"].astype(str))
~~~

<h2>繰り返しリストへ格納する</h2>
格納先=map(lambda x:関数,データ）という形になる

~~~python
familymap = map(lambda x: x[0],familylist)
~~~
lambdaはdefのように関数を定義できるもの

<h2>pandasで欠損値がある列だけを抽出</h2>
data.isna()でnullになっているものを探す。.any()でその列にTrueがある列を抽出する。そしてloc[:,na_col]でna_colに該当するすべての値を抽出する

~~~python
na_col = data.isna().any()
data.loc[:,na_col]
~~~

<h2>pandasで欠損値処理を複数列一緒にやる方法</h2>
まずリストを作成する。そのリストに対して、fillnaをするのだが、iloc[0]での指定やnumeric_only=Trueで特定の列一つずつに対して処理ができる

~~~python
null_category_list = ["MSZoning","Utilities","Exterior1st","Exterior2nd",'MasVnrType','BsmtQual', 'BsmtCond', 'BsmtExposure',
       'BsmtFinType1', 'BsmtFinType2', 'Electrical', 'KitchenQual', 'Functional', 'FireplaceQu',
       'GarageType','GarageFinish', 'GarageQual', 'GarageCond', 'PoolQC', 'Fence',
       'MiscFeature',"SaleType"]
data[null_category_list] = data[null_category_list].fillna(data.mode().iloc[0])

null_float_list = ["LotFrontage",'MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF', 'TotalBsmtSF', 'BsmtFullBath',
       'BsmtHalfBath', 'GarageYrBlt', 'GarageCars',
       'GarageArea']
data[null_float_list] = data[null_float_list].fillna(data.median(numeric_only=True))
~~~