Pandas数据帧根据键减少/添加行

时间:2017-12-12 19:38:48

标签: python pandas dataframe reduce

我正在努力解决一些简单的问题。希望有一个简单的解决方案。我的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解决,但希望有一个更简单的解决方案。

2 个答案:

答案 0 :(得分:3)

agggroupby

一起使用
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