for if文を使うよりも、内包表記のほうが処理時間が高速であるようなので、
下記のdf1、df2のデータフレームを使って、df2の直交部を置き換えるコードを、内包表記で書きたいのですが、書き方を教えていただきたいです。(今回のデータフレーム例ですが、実際はもっとデータ行列数が多く、少しでも計算時間を短くしたいです)
python
1 2df1 = pd.DataFrame(data={0: ['A','B','C'],1: ['a','b','a'],2: ['+','-','+']}) 3 4 0 1 2 50 A a + 61 B b - 72 C a + 8 9df2 = pd.DataFrame(data={0: [np.nan,'A','B','C'],1: ['a',1,np.nan,1],2:['b',np.nan,-1,np.nan],3:['f',np.nan,np.nan,-1]}) 10 11 0 1 2 3 120 NaN a b f 131 A 1 NaN NaN 142 B NaN -1 NaN 153 C 1 NaN -1 16 17for i in range(len(df1.index)) : 18 for j in range(1,len(df2.index)) : 19 for k in range(1,len(df2.columns)) : 20 if df1[0][i] == df2[0][j] : 21 if df1[1][i] == df2[k][0] : 22 df2[k][j] = df1[2][i] 23 24df2.head() 25 26 0 1 2 3 270 NaN a b f 281 A + NaN NaN 292 B NaN - NaN 303 C + NaN -1
for if文を使うよりも、内包表記のほうが処理時間が高速であるようなので、
とのことですが、内包表記では処理時間は速くなりません。
高速化したいなら、他のことを勉強することをお勧めします。
ご指摘ありがとうございます。
勉強のために、質問させていただいたコードの内包表記の仕方を教えていた抱けますでしょうか。
よろしくお願いします。
答えではないのでコメント欄に…
確かに内包表記のカスケードで"いくらかは"早くなるとは思います。
# https://www.geeksforgeeks.org/nested-list-comprehensions-in-python/
が、デメリットが大きいです
1. 可読性が大変なことになる(慣れ次第?)
2. その結果、あとから書き換えようとすると涙目に(経験あり)
個人的にはnumbaがおすすめです。from numba import jitのやつです。
dataframeは使えない、一部のNumpyの関数は対象外など制限はありますが、
生のPythonで三重、四重になったforのカスケードをぶん回すよりは格段に速いです。
10倍高速化はザラにありますし、100倍、1000倍高速化もあり得る話です。
https://qiita.com/ryo_naka/items/6d6a575d0c47bb792f71
リストの内包表記は、リスト生成の構文です。
ご提示のコードはすでに存在する df2 リストの要素を更新するものです。
もし内包表記が使用できても、無駄に使用しないリストを生成するため処理時間は遅くなるのでは?
回答1件
あなたの回答
tips
プレビュー