基于同一列的先前值对列值进行矢量化计算?
Vectorized calculation of a column's value based on a previous value of the same column?
我有一个包含两列 A
、B
的 pandas 数据框,如下所示。
我想要一个矢量化解决方案来创建新列 C,其中 C[i] = C[i-1] - A[i] + B[i]
。
df = pd.DataFrame(data={'A': [10, 2, 3, 4, 5, 6], 'B': [0, 1, 2, 3, 4, 5]})
>>> df
A B
0 10 0
1 2 1
2 3 2
3 4 3
4 5 4
5 6 5
这是使用 for 循环的 :
df['C'] = df['A']
for i in range(1, len(df)):
df['C'][i] = df['C'][i-1] - df['A'][i] + df['B'][i]
>>> df
A B C
0 10 0 10
1 2 1 9
2 3 2 8
3 4 3 7
4 5 4 6
5 6 5 5
... 完成工作。
但是由于与向量化计算相比循环速度较慢,我想要一个向量化解决方案 pandas:
我试过这样使用 shift()
方法:
df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B']
但这并没有帮助,因为移动的 C 列未随计算更新。它保持其原始值:
>>> df['C'].shift(1).fillna(df['A'])
0 10
1 10
2 2
3 3
4 4
5 5
这会产生错误的结果。
这可以被矢量化,因为:
delta[i] = C[i] - C[i-1] = -A[i] +B[i]
。您可以先从 A
和 B
获得 delta
,然后...
- 计算
delta
(加上 C[0]
)的累计总和得到完整的 C
代码如下:
delta = df['B'] - df['A']
delta[0] = 0
df['C'] = df.loc[0, 'A'] + delta.cumsum()
print df
A B C
0 10 0 10
1 2 1 9
2 3 2 8
3 4 3 7
4 5 4 6
5 6 5 5
我有一个包含两列 A
、B
的 pandas 数据框,如下所示。
我想要一个矢量化解决方案来创建新列 C,其中 C[i] = C[i-1] - A[i] + B[i]
。
df = pd.DataFrame(data={'A': [10, 2, 3, 4, 5, 6], 'B': [0, 1, 2, 3, 4, 5]})
>>> df
A B
0 10 0
1 2 1
2 3 2
3 4 3
4 5 4
5 6 5
这是使用 for 循环的
df['C'] = df['A']
for i in range(1, len(df)):
df['C'][i] = df['C'][i-1] - df['A'][i] + df['B'][i]
>>> df
A B C
0 10 0 10
1 2 1 9
2 3 2 8
3 4 3 7
4 5 4 6
5 6 5 5
... 完成工作。
但是由于与向量化计算相比循环速度较慢,我想要一个向量化解决方案 pandas:
我试过这样使用 shift()
方法:
df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B']
但这并没有帮助,因为移动的 C 列未随计算更新。它保持其原始值:
>>> df['C'].shift(1).fillna(df['A'])
0 10
1 10
2 2
3 3
4 4
5 5
这会产生错误的结果。
这可以被矢量化,因为:
delta[i] = C[i] - C[i-1] = -A[i] +B[i]
。您可以先从A
和B
获得delta
,然后...- 计算
delta
(加上C[0]
)的累计总和得到完整的C
代码如下:
delta = df['B'] - df['A']
delta[0] = 0
df['C'] = df.loc[0, 'A'] + delta.cumsum()
print df
A B C
0 10 0 10
1 2 1 9
2 3 2 8
3 4 3 7
4 5 4 6
5 6 5 5