df["名前"]とdf["年齢"]の列を持つ100万行くらいのDataframeがあります.それぞれの型はstrとintです.
このうち10件程度の年齢がnanになっているのですが,それを修正するための名前=年齢の対応表があるので条件一致で置き換えようと思いました.
最終的に年齢の一次元リスト(通常のものでもnumpyでも構わない)を得ることが目的です.
※同姓同名で片方の年齢だけnanというデータが存在します.
ひとつひとつ置換してからリスト化してみる
python
1df.loc[(df["名前"]=="1番目太郎")&(df["年齢"]!=df["年齢"]),"年齢"]=20 2df.loc[(df["名前"]=="2番目花子")&(df["年齢"]!=df["年齢"]),"年齢"]=25 3#中略 4df.loc[(df["名前"]=="10番目の人")&(df["年齢"]!=df["年齢"]),"年齢"]=70 5years=list(df["年齢"] 6#リスト化に内包表記を使っても速度はほとんど変わらなかった
なんか遅かったのでisnullしてみたけど速度がほとんど変わらなかったやつ
python
1nulls=df["年齢"].isnull() 2df["nulls"]=nulls 3df.loc[(df["名前"]=="1番目太郎")&(df["nulls"]==True),"年齢"]=20 4#中略
内包表記内に三項演算子10連鎖するやつ
python
1years=[df["年齢"].iloc[i] if df["年齢"].iloc[i]==df["年齢"].iloc[i] else 2 20 if df["名前"].iloc[i]=="なんとか太郎" else 3 25 if df["名前"].iloc[i]=="かんとか花子" else 4 70 for i in range(len(df))]#中略
前者のコードだとだいたい20秒,後者のコードだと10秒切るくらいでした
できるだけループしないプログラムの書き方がナウいし速いというようなことをちらっと聞いたのですが
A列のnanをB列の条件で任意値に置換したい場合,普通はどうやるもんなんでしょうか.
あと,この例は10件の置き換えなんですが,これが100件の置換とかだったら内包表記の方法もちょっとしんどいかなあと思うのですが
そのときはこうする,というのもお答えいただけると大変参考になります
よろしくお願いします
回答3件
あなたの回答
tips
プレビュー