将公式应用于熊猫数据框
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
我有一个很简单的问题。我有一个这样的数据框
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