讓我們假設,我們給出以下功能:應用lambda函數使用更新的值
def f(x,y):
y = x + y
return y
功能f(x,y)
總結兩個數字(但它可能是兩個參數的任何或多或少複雜的功能)。現在讓我們看看下面的
import pandas as pd
import random
import numpy as np
random.seed(1234)
df = pd.DataFrame({'first': random.sample(range(0, 9), 5),
'second': np.NaN}, index = None)
y = 1
df
first second
0 7 NaN
1 1 NaN
2 0 NaN
3 6 NaN
4 4 NaN
的提問數據幀的第二列是在這裏無關緊要的範圍,所以我們可以不失一般性假設要NaN
。考慮到變量y
已被初始化爲1,讓我們對數據幀的每一行應用f(x,y)
。第一次迭代返回7 + 1 = 8;現在,再次將函數應用於第二行時,我們希望y
值更新爲先前計算的8,因此最終結果爲1 + 8 = 9,依此類推。
什麼是pythonic方式來處理這個?我想避免循環和重新分配循環內的變量,因此,我的猜測是沿
def apply_to_df(df, y):
result = df['first'].apply(lambda s: f(s,y))
return result
線的東西但是人們可以很容易地看到,上述不考慮更新的值,而它計算所有計算初始值爲y=1
。
print(apply_to_df(df,y))
0 8
1 2
2 1
3 7
4 5
什麼你所描述的是一個遞推關係。雖然已經討論過,並且有一個關於它的開放(但是老的)[問題](https://github.com/pandas-dev/pandas/issues/4567),但在熊貓中沒有內建的方法。 。現在,你必須循環才能做到這一點。 – BrenBarn
這不是cumsum(),還是更一般的減少? – jeremycg
在這種情況下,它看起來是:'df ['first']。cumsum()+ y0',其中'y0'是y的初始種子值(本例中爲1)。 – Alexander