首页 > 解决方案 > 如何在groupby中设置一个带有pandas条件的标志

问题描述

我有以下数据框

  code   date         time     product  tank     stock     out_value 
  123    2019-06-20   07:00    MS       1        370       350
  123    2019-06-20   07:30    HS       3        340       350
  123    2019-06-20   07:00    MS       2        340       350
  123    2019-06-20   07:30    HS       4        340       350
  123    2019-06-20   08:00    MS       1        470       350
  123    2019-06-20   08:30    HS       3        450       350
  123    2019-06-20   08:00    MS       2        470       350
  123    2019-06-20   08:30    HS       4        490       350
  123    2019-06-20   09:30    HS       4        0         350
  234    2019-06-20   09:30    HS       1        200       350

我想找出哪些stock值小于out_value上述数据框中的值,不包括0值。例如,在产品的日期07:30为 ro 代码时,有两个罐,因此,如果两个罐的库存都低于,则标志设置为。1232019-06-20HS34out_value1

我想要的数据框是

  code   date         time     product  tank     stock     out_value    flag
  123    2019-06-20   07:00    MS       1        370       350          0
  123    2019-06-20   07:30    HS       3        340       350          1
  123    2019-06-20   07:00    MS       2        340       350          0
  123    2019-06-20   07:30    HS       4        340       350          1
  123    2019-06-20   08:00    MS       1        470       350          0
  123    2019-06-20   08:30    HS       3        450       350          0
  123    2019-06-20   08:00    MS       2        470       350          0
  123    2019-06-20   08:30    HS       4        490       350          0
  123    2019-06-20   09:30    HS       4        0         350          0
  234    2019-06-20   09:30    HS       1        200       350          1

我怎样才能在熊猫中做到这一点?

标签: pandas

解决方案


如果需要检查与非0值的差异,然后使用和检查每组True的所有值:GroupBy.transformGroupBy.all

df['flag'] = ((df['stock']<df['out_value']) & (df['stock'] !=0))

df['flag'] = df.groupby(['code','date','time','product'])['flag'].transform('all').astype(int)
print (df)
   code        date   time product  tank  stock  out_value  flag
0   123  2019-06-20  07:00      MS     1    370        350     0
1   123  2019-06-20  07:30      HS     3    340        350     1
2   123  2019-06-20  07:00      MS     2    340        350     0
3   123  2019-06-20  07:30      HS     4    340        350     1
4   123  2019-06-20  08:00      MS     1    470        350     0
5   123  2019-06-20  08:30      HS     3    450        350     0
6   123  2019-06-20  08:00      MS     2    470        350     0
7   123  2019-06-20  08:30      HS     4    490        350     0
8   123  2019-06-20  09:30      HS     4      0        350     0
9   234  2019-06-20  09:30      HS     1    200        350     1

或者,如果只需要测试差异,请使用掩码测试每个组和最后一个链以测试非0值:

df['flag'] = df['stock']<df['out_value']
mask = df.groupby(['code','date','time','product'])['flag'].transform('all')
df['flag'] = (mask & (df['stock'] !=0)).astype(int)

推荐阅读