目的
pandasを使うときに役に立つワンポイントコードを記録するためリストインポート時に1行目をカラムにする
data=["a","b","c"]
df = pd.DataFrame(data)
df.columns = df.iloc[0]
#1行目をカラムに設定する
df = df.drop(df.index[0])
#1行目を削除する
2つのデータフレームで重複している行を削除
df_rewrite_del = df_rewrite[~df_rewrite["Page"].isin(df_del)]
df_rewrite_del
#df_delに含まれているdf_rewrite["Page"]を出してくる、という作業の逆をしている(~ の効果)
pandas のconcatのエラー対処
pd.concat(df_other,df_iimono)
pd.concat(df_other,df_iimono)
以下のエラーが出る
first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
pd.concat([df_other,df_iimono])
pandasの結合の種類の違い
pandasでデータフレームを結合する種類は、concat merge join の3種類
concatの使い方
concatは縦にも横にもつなげられるのが特徴ただし、[ ]で囲む必要があるのと、結合の種類を変える場合はjoin=" "が必要
pd.concat([df1,df2])
#df1とdf2を縦につなげる
pd.concat([df1,df2],join="inner")
#縦方向に内部結合する
pd.concat([df1,df2],axis=1)
#横方向に結合する
mergeの使い方
mergeは基本的に横につなげるただし、[ ]で囲む必要はなく、結合の種類を変える場合はhow=" "が必要
横のみだが、各量が少なく多くの結合方法ができる
df1.merge(df2)
#df1とdf2を横につなげる。この際は共通する列名をキーとして結合。内部結合
pd.merge(df1,df2,on="shop")
#shopというカラムを軸にして結合
pd.merge(df1,df2,how="right")
#右結合
joinの使い方
joinは基本的に横につなげるインデックスを軸に横結合をするのが特徴。そのため3種類以上のdataFrameも結合可能
df1.join(df2)
#df1とdf2を横につなげる。Indexをキーとして結合。内部結合
また、まれに
columns overlap but no suffix specified
というエラーが出ることがある。
この原因は結合するdfに同じカラム名がある場合に起こっているから起こる現象。だから、この場合は、左右少なくともどちらかの接尾語を指定する必要があります。
文字列の中から特定の文字が入っているか判定
判定をするときにはinを使って判定を行う。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
groupby関数でグループ分け
年月で料金をグループ分けしたいときには、groupby()関数を使うとよいjoin_data.groupby(["payment_month","item_name"]).sum()[["price","quantity"]]
#join_dataをpayment_monthとitem_nameでグループ分けして、priceとquantityの合計値を表す
参考)Python実践データ分析100本ノック 第1章
時系列データの変換
まずはpd.to_datetimeで時系列データへ変換をする次に時系列データを特定の形式へ変換するには、dt.strftime("")を使う
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章
ピボットテーブルの作成
まずはpd.pivot_tableでピボットテーブルの作成が可能index/columnsでそれぞれの行列に入る要素を入力できる
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章
特定の条件を満たす行をリストアップする
colを使うとよいcolは特定の条件に合う行や列をリストアップできるものである
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章
特定のカラムを外したdataframeを作る方法
列のtrue/falseの判定を行い、そこからtrainへ反映させる
x_train = train[train.columns[train.columns!="Survived"]]
#trainのdfから"Survived"の名前の列が付いたものか否かを判定し、Trueだった場合のカラム列を作る。そのカラム列のdfを作る
pandasで特定の列だけ除外したdfを作る
df[df.columns[df.columns != 'b']]
#dfのリストの"b"の列以外を残したdfを作る方法
参考)https://qiita.com/ophhdn/items/2e88814cc23c8d62b12c
trueになっているものを残し、falseの場合はNaNへ変換
.whereを使うdata["Family_name_size"] = data["Family_name_size"].where(data["Family_name_size"].isin(fami))
# つまり df.where(data)でかける
pandasの2つの列を結合させる
〇〇.str.cat(××)で結合できる
data["Family_name"].str.cat(data["familysize"].astype(str))
繰り返しリストへ格納する
格納先=map(lambda x:関数,データ)という形になるfamilymap = map(lambda x: x[0],familylist)
lambdaはdefのように関数を定義できるもの
pandasで欠損値がある列だけを抽出
data.isna()でnullになっているものを探す。.any()でその列にTrueがある列を抽出する。そしてloc[:,na_col]でna_colに該当するすべての値を抽出するna_col = data.isna().any()
data.loc[:,na_col]
pandasで欠損値処理を複数列一緒にやる方法
まずリストを作成する。そのリストに対して、fillnaをするのだが、iloc[0]での指定やnumeric_only=Trueで特定の列一つずつに対して処理ができる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))