根据条件在熊猫列中添加或减去行

时间:2020-02-02 20:42:20

标签: python pandas dataframe

我有这个脚本:

df1=pd.DataFrame([["a",10],["a",15],["b",16],["a",11],["b",12],["b",14],["b",17],
                  ["b",19],["a",10]], columns=["col1","col2"])

给出以下输出:

  col1 col2
0   a   10
1   a   15
2   b   16
3   a   11
4   b   12
5   b   14
6   b   17
7   b   19
8   a   10

在此期间,我有一个等于1000的变量(期初余额)。每当col1中有“ a”时,我都希望通过col2中的值增加期初余额;每当col1中有“ b”时,我想通过col2中的值来减少累计余额。因此预期结果是:

1000 + 10 + 15-16 + 11-12-14-17-19 + 10 = 968。

如果可能的话,我还想创建一列“余额”,在每一步/每一步我都会看到所产生的余额。

    col1    col2    balance
0    a       10      1010
1    a       15      1025
2    b       16      1009
3    a       11      1020
4    b       12      1008
5    b       14      994
6    b       17      977
7    b       19      958
8    a       10      968

2 个答案:

答案 0 :(得分:4)

您可以有条件地用np.where分配符号,然后使用cumsum

(np.where(df['col1'] == 'a', 1, -1) * df['col2']).cumsum() + 1000

0    1010
1    1025
2    1009
3    1020
4    1008
5     994
6     977
7     958
8     968
Name: col2, dtype: int64

相同的想法,而不是使用map

df['col1'].map({'a': 1, 'b': -1}).mul(df['col2']).cumsum().add(1000)

0    1010
1    1025
2    1009
3    1020
4    1008
5     994
6     977
7     958
8     968
Name: col2, dtype: int64

map的优点是输出是一个Series(与返回一个numpy数组的where相对),因此这自然使它更适合于方法链接。但是,where的阴影要快一些(因为numpy)。

答案 1 :(得分:2)

相同的解决方案

df1['Balance'] = df_.col1.map({'a': 1 , 'b':-1}) * df1.col2.cumsum() + 1000
print(df1)

 col1  col2  Balance
0    a    10  1010
1    a    15  1025
2    b    16  1009
3    a    11  1020
4    b    12  1008
5    b    14   994
6    b    17   977
7    b    19   958
8    a    10   968