実現したいこと
Pandasのgroupbyとapply関数を用いてデータフレームの数値からグループ別の割合を算出したい。
発生している問題・分からないこと
Pandasのバージョンを1系(1.0.5)から2系(2.2.1)に上げたところ、apply関数の挙動が変わっていることに気づきました。
具体的には、groupbyとapply関数を使ってグループ別の割合を算出した際に、2系においては意図しない結果が得られてしまいます。(ソースコードを参照してください。)
そこで以下について教えて下さい。
①Pandasの2系でapply関数を使って割合を算出する方法について
一旦グループ別に合計を算出したデータフレームを作ってから、元のデータにマージする...等の方法で一応解決はできるのですが、apply関数を用いてスマート(極力1行で)に実装したいと考えています。
2系の仕様でgroupbyとapply関数を用いてグループ別の割合を算出する方法を教えていただけないでしょうか。
このような2系のapply関数の挙動ですが、これまでの1系のそれに慣れている身からすると、少し不可解です。どういう計算をしてこのような結果になっているのかが検討が付きません…。
ご教示の程をお願いします。
該当のソースコード
#--性別別にfareの値を割合に変換するコード #--pandasのversionが1.0.5の場合-------------------------------------------------------- import pandas as pd df = pd.read_csv(r'https://hbiostat.org/data/repo/titanic3.csv') #--以下のapply関数で男女別にfareの数値の割合を算出 df["rate"] = df.groupby(["sex"])["fare"].apply(lambda x: x/x.sum()).reset_index(drop=True) print(df.groupby("sex")["rate"].sum()) #sex #female 1.0 #male 1.0 #性別ごとに上記コードで算出したrateを足すと1(100%)になる。(意図した通りの挙動) #--pandasのversionが2.2.1の場合-------------------------------------------------------- import pandas as pd df = pd.read_csv(r'https://hbiostat.org/data/repo/titanic3.csv') #--以下のapply関数で男女別にfareの数値の割合を算出 df["rate"] = df.groupby(["sex"])["fare"].apply(lambda x: x/x.sum()).reset_index(drop=True) print(df.groupby("sex")["rate"].sum()) #sex #female 0.762784 #male 1.237216 #性別ごとに上記コードで算出したrateを足すと1(100%)にならない。(意図していない挙動)
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
"pandas apply change"等の単語で調査を行いましたが、有益な情報は得られませんでした。
補足
特になし
回答2件
あなたの回答
tips
プレビュー