0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-04-06

目的

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)

以下のエラーが出る
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に同じカラム名がある場合に起こっているから起こる現象。だから、この場合は、左右少なくともどちらかの接尾語を指定する必要があります。

lsuffix="df1の接尾語" rsuffix="df2の接尾語"

文字列の中から特定の文字が入っているか判定

判定をするときには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))
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?