【问题标题】:Conditional groupby and shift in pandaspandas 中的条件 groupby 和 shift
【发布时间】:2018-04-03 23:31:42
【问题描述】:

我有一个看起来像这样的数据框,它按订单簿的订单信息存储订单。类型 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**

【问题讨论】:

  • 实现什么?你的问题不清楚。您的输入通过什么代码进行?提供的输出是您拥有的还是您想要的?
  • @jpp - 我认为这是不正确的封闭问题,所以重新打开。

标签: python pandas shift


【解决方案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

【讨论】:

    【解决方案2】:

    我认为需要:

    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 的值替换为NaNs 为mask 或反转条件为where
    2. 然后groupby 由助手Series 由连续的order_id 创建,并由NaNs 由DataFrameGroupBy.ffill 前向填充:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-25
      • 2020-09-25
      • 2018-08-04
      • 2018-09-29
      • 2020-03-03
      • 2019-08-11
      • 1970-01-01
      • 2017-04-04
      相关资源
      最近更新 更多