如何在groupby中设置带有熊猫条件的标志

时间:2019-07-15 11:10:02

标签: 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的日期123的代码2019-06-20HS处有两个储罐34,因此,如果两个坦克低于out_value,则标志设置为1

我想要的数据框是

  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

我怎么在熊猫里做?

4 个答案:

答案 0 :(得分:4)

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

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)

答案 1 :(得分:1)

这应该做到:

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

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

答案 2 :(得分:0)

您可以这样做,它可以为您提供的数据框提供正确的结果,但是我不确定这是否就是您想要的。

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

答案 3 :(得分:0)

对我来说,您问的是什么还不清楚。如果您想标记为1,则stock下面所有out_value的行,除非它们是0,您都可以...

df['flag'] = 0
df.loc[(df['stock'] < df['out_value']) & (df['stock'] != 0), 'flag'] = 1