[英]apply to the entire dataframe a user-defined function involving another dataframe in pandas
我想在兩個數據幀df1和df2之間做一些數學運算,但我發現很難使用pd.apply函數:
DF1:
number1 number2 number3 …
0 0 0 0 …
1 0 0.25 0 …
2 0.1 0.1 0 …
3 0 0 0.3 …
4 0 0 0 …
DF2:
number1 number2 number3 …
0 2 3.3 6 …
1 2.1 3.4 6 …
2 2.2 3.2 5.8 …
3 2.1 3.4 6.2 …
4 2 4.0 6.4 …
我想按照以下規則更改df1中的每個元素:
現在我有一個有效的代碼:
df1_new=pd.DataFrame(1,index = df1.index,columns = df1.columns)
df2_sft=df2.shift(1)
m,n=np.where(np.array(df1)!=0)
for i in m:
for j in n:
df1_new.iloc[i,j]=(1-df1.iloc[i,j])/df2_sft.iloc[i,j]
但正如你所看到的,如果df1和df2很大,它只是丑陋而且非常慢。 我相信必須有很多其他方法可以很快地完成這個簡單的數學運算,希望你能提供一些幫助。
另外,我總是對apply和applymap感到困惑,有什么區別,什么時候應該使用另一個?
你想要對代碼進行矢量化,也就是說,而不是使用for循環來對整個DataFrame /數組進行計算,類似下面的代碼會快得多:
In [11]: ((1 - df1) / df2_sft).where(df1 != 0, 1)
Out[11]:
number1 number2 number3
0 1.000000 1.000000 1.00000
1 1.000000 0.227273 1.00000
2 0.428571 0.264706 1.00000
3 1.000000 1.000000 0.12069
4 1.000000 1.000000 1.00000
注意:這與您的代碼不匹配,因為您( 錯誤地 )不僅僅迭代非零元素(因為您迭代m中的每個元素的所有項目,而不是壓縮的項目)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.