簡體   English   中英

適用於整個數據幀的用戶定義函數涉及pandas中的另一個數據幀

[英]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中的每個元素:

  1. 將df1中的每個0元素更改為1
  2. df1中的每個非零元素,讓df.iloc [m,n] =(1-df.iloc [m,n])/ df2.shift(1).iloc [m,n],其中m,n是非零元素的位置

現在我有一個有效的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM