我有这个脚本:
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
答案 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