我有一个包含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
我想以下列方式创建一个新列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
这项工作是做什么的.
但是因为与矢量化计算相比,循环通常很慢,所以我想知道在大熊猫中是否存在这种矢量化解决方案.(这就是这个新问题的原因).
我试着像这样使用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