我正在努力解决一些简单的问题。希望有一个简单的解决方案。我的Dataframe看起来像这样。
DataFrame:
8 buy 4
7 sell 1
6 buy 1
5 sell 3
4 sell 10
3 buy 100
2 buy 110
1 buy 120
有没有办法添加相同的订单?所以将df转换为:
DataFrame:
8 buy 4
7 sell 1
6 buy 1
4 sell 3 + 10
1 buy 100 + 110 + 120
我的问题有点复杂。我认为它可以用iterrows解决,但希望有一个更简单的解决方案。
答案 0 :(得分:3)
将agg
与groupby
df.groupby((df.b!=df.b.shift()).ne(0).cumsum()).agg({'a':'last','c':lambda x : '+'.join(x.astype(str)),'b':'first'})
Out[1227]:
a c b
b
1 8 4 buy
2 7 1 sell
3 6 1 buy
4 4 3+10 sell
5 1 100+110+120 buy
数据输入:
df
Out[1228]:
a b c
0 8 buy 4
1 7 sell 1
2 6 buy 1
3 5 sell 3
4 4 sell 10
5 3 buy 100
6 2 buy 110
7 1 buy 120
更多信息:
(df.b!=df.b.shift()).ne(0).cumsum()
Out[1229]:
0 1
1 2
2 3
3 4
4 4
5 5
6 5
7 5
Name: b, dtype: int32
答案 1 :(得分:0)
看起来你可能正在寻找实际的总和,而不是添加的字符串表示。假设您有以下内容:
id_ order px
0 8 buy 4
1 7 sell 1
2 6 buy 1
3 5 sell 3
4 4 sell 10
5 3 buy 100
6 2 buy 110
7 1 buy 120
如果是这种情况,可以在这里使用:
df['order_bin'] = np.where(df.order=='buy', 1, 0)
df['group'] = (df.order_bin.diff().fillna(0.) != 0.).cumsum()
df.groupby('group')['px'].sum()
0 4
1 1
2 1
3 13
4 330