2017-04-12 84 views
0

我已經想出瞭如何將函數應用於熊貓數據框的整個列或子部分,以代替編寫逐個修改每個單元的循環。在熊貓數據框中應用函數

在執行上述操作時,是否可以編寫一個將數據框內的單元格作爲輸入的函數?

例如,當前單元格中的函數返回前一個單元格的值乘以該單元格之前的單元格的乘積。我現在正在逐行循環執行此操作,而且這並不令人驚訝,效率很低。我對Python非常陌生。

+0

HTTP:/ /pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html –

回答

0

對於你提到的情況下(前面兩個細胞倍增),你可以做以下的(通過各列循環,但不是每個單元格):

import pandas as pd 

a = pd.DataFrame({0:[1,2,3,4,5],1:[2,3,4,5,6],2:0,3:0}) 

for i in range(2,len(a)): 
    a[i] = a[i-1]*a[i-2] 

這將使每一列a的前兩列相乘

如果要執行此操作下去行而不是列,你可以transpose數據幀(然後再次執行循環後轉就讓它回到原來的格式)

編輯

實際需要的是前兩行兩列中的元素和兩列當前行中的元素的乘積。這可以通過使用移位:

import pandas as pd 

df= pd.DataFrame({"A": [1,2,3,4], "B": [1,2,3,4], "C": [2,3,4,5], "D": [5,5,5,5]}) 

df['E'] = df['A'].shift(1)*df['B'].shift(1)*df['C']*df['D'] 

df['E'] 

產地:

0  NaN 
1  15.0 
2  80.0 
3 225.0 
+0

我想我堅持考慮一個函數的語法,該函數在數據框中提取前一個值(不使用for循環) 。如果我想把每一列乘以某個數字,我已經發現了很多。有什麼建議? – John

+1

我已經根據我的想法編輯了我的答案。如果這不是你想要的,如果你可以用一個示例輸入和期望的輸出來編輯你的答案,這將是非常有用的。 – Kewl

+0

我有這個df作爲輸入。 Df = pd.DataFrame({「A」:[1,2,3,4],「B」:[1,2,3,4],「C」:[2,3,4,5 ],「D」:[5,5,5,5]})' 所以作爲一個例子,我會遍歷每一行並取出列C和D的乘積,然後將其添加到前一行的A& B.這個最終值將被放在一個新的列E中,使得最終的數組看起來像: 'df = pd.DataFrame({「A」:[1,2,3,4],「B」:[ 「1,2,3,4」,「C」:[2,3,4,5],「D」:[5,5,5,5],「E」:[0,15,80,225]}) ' (E中的第一個值固定爲0) 我知道如何使用for循環執行此操作,但對於非常大的數據幀,這些計算需要一段時間。 – John

0

這是卓有成效的,並且換擋可以去向前或向後取決於你的需要:

df['Column'] = df['Column'].shift(1) * df['Column'].shift(2)