dim*_*myG 5 python vectorization pandas difference
我有一个包含2列的pandas数据框,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我想以下列方式创建一个新列C:C [i] = C [i-1] -A [i] + B [i]
在这个问题中,答案建议使用这样的循环:
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
Run Code Online (Sandbox Code Playgroud)
这项工作是做什么的.
但是因为与矢量化计算相比,循环通常很慢,所以我想知道在大熊猫中是否存在这种矢量化解决方案.(这就是这个新问题的原因).
我试着像这样使用shift方法
df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B']
Run Code Online (Sandbox Code Playgroud)
但它没有帮助,因为移位的C列没有更新计算.它保留了原始值:
>>> df['C'].shift(1).fillna(df['A'])
0 10
1 10
2 2
3 3
4 4
5 5
Run Code Online (Sandbox Code Playgroud)
这会产生错误的结果.
由于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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |