有条件的groupby和pandas的转变

时间:2018-04-03 14:58:42

标签: python pandas shift

我有一个类似于此的数据框,它按订单簿的订单信息存储订单。键入N =新订单,D =删除订单,E =执行。可以重复使用相同的order_id。

所以基本上问题是删除和执行没有适当的价格,因为它们应该由具有相同oid的最后一个新订单推断。有人会建议一种方法来实现这一目标吗?谢谢

输入

       type        order_id      price
0         N              10         99
1         E              10          0
1         E              10          0
1         D              10          0
0         N              11         98
1         N              10         97
1         D              10          0

输出

       type        order_id      price
0         N              10         99
1         E              10         **99**
1         E              10         **99**
1         D              10         **99**
0         N              11         98
1         N              10         97
1         D              10         **97**

2 个答案:

答案 0 :(得分:1)

好像你需要replace + ffill,因为在这里我假设你有正确的df顺序。

df.replace(0,np.nan).ffill()
Out[758]: 
  type  order_id  price
0    N        10   99.0
1    E        10   99.0
1    E        10   99.0
1    D        10   99.0
0    N        11   98.0
1    N        10   97.0
1    D        10   97.0

或者我们添加groupby

df.assign(price=df.price.replace(0,np.nan)).groupby(df.type.eq('N').cumsum()).price.ffill().values

答案 1 :(得分:1)

我认为需要:

df['price'] = df['price'].mask(df['type'].isin(['E','D']))
#df['price'] = df['price'].where(df['type'] == 'N')

df['price'] = df.groupby(df['order_id'].ne(df['order_id'].shift()).cumsum())['price'].ffill()

print (df)
  type  order_id  price
0    N        10   99.0
1    E        10   99.0
1    E        10   99.0
1    D        10   99.0
0    N        11   98.0
1    N        10   97.0
1    D        10   97.0

<强>解释

  1. 首先将price替换为NaN的{​​{3}}或倒置条件mask
  2. 然后groupby由连续Series创建的助手order_id,并where向前填充NaN