将公式应用于熊猫数据框

Apply a formula to a panda Dataframe

我有一个很简单的问题。我有一个这样的数据框

In [19]: df = DataFrame(randn(10,2),columns=list('A'))

In [20]: df

Out[20]: 
          A  
0  0.958465  
1 -0.769077  
2  0.598059  
3  0.290926 
4 -0.248910 
5 -1.352096 
6  0.009125
7 -0.993082
8 -0.593704
9  0.523332

我想使用以下信息创建一个新列 B

          A              B
0  0.958465  
1 -0.769077  A1*A1+2*A0*A2
2  0.598059  A2*A2+2*A1*A3
3  0.290926  A3*A3+2*A2*A4
4 -0.248910  A4*A4+2*A3*A5
5 -1.352096  ...
6  0.009125  ...
7 -0.993082  ...
8 -0.593704  ...
9  0.523332  ...

这是一种卷积或自相关,但每次都使用不同的 window。如何在 Pandas 中定义这样的公式?

第二个问题:如何使公式中涉及的点数可变(在示例中我只是使用上一个点和下一个点进行计算,但是我如何传递一个变量来表示pandas我要用于计算的点数)?

df['B'] df['A']**2 + 2 * df['A'].shift() * df['A'].shift(-1)
df
          A         B
0  0.958465       NaN
1 -0.769077  1.737917
2  0.598059 -0.089814
3  0.290926 -0.213088
4 -0.248910 -0.724764
5 -1.352096  1.823621
6  0.009125  2.685568
7 -0.993082  0.975377
8 -0.593704 -0.686939
9  0.523332       NaN

您可以创建这样的函数以允许可变数量的滞后。

def func(s, lags=1):
    return sum(s.shift(lag) * s.shift(-lag) for lag in range(lags+1))

df = pd.DataFrame({"A": [0.958465, -0.769077, 0.598059, 0.290926, -0.248910, -1.352096, 0.009125, 0.993082, -0.593704, 0.523332]})
df["B"] = func(df["A"], 1) # takes 1 point on either side
df["C"] = func(df["A"], 2) # takes 2 points on either side

我觉得,不用apply也是可以的,以防:


import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 1), columns=['A'])

df['B'] = df['A'] ** + 2 * df['A'].shift(periods=1) * df['A'].shift(periods=-1)

print(df)


输出:

          A         B
0  0.383006       NaN
1 -1.240859 -0.469964
2 -0.796920 -0.393244
3  0.499011  0.358630
4 -1.807221 -0.701899
5 -0.430667  0.296360
6 -0.884149  0.475958
7 -1.413762  3.492830
8 -1.976511  5.939588
9 -1.075428       NaN