如何使用pandas中的条件在groupby中设置标志

如何使用pandas中的条件在groupby中设置标志,pandas,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

我有一个如下的数据帧

  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
我想找出除了
0
值之外,在上述数据框中哪些
stock
值小于
out\u值。
e、 g.在日期
2019-06-20
HS
07:30
对于ro code
123
产品
HS
有两个储罐
3
4
,因此如果两个储罐的库存均低于
out\u值
,则标志设置为
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
如何在pandas中实现它?

您可以做到,它为您提供的数据帧提供了(我猜)正确的结果,但我不确定这是否是您想要的


df['flag']=((df['stock']如果需要检查与非
0
值的差异,然后使用和检查各组的所有
True
值:

这应该做到:

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
df['flag']=(df.assign(flag=(df.stock0))
.groupby(['code','date','time','product'],as_index=False)['flag']
.转换(全部)
.astype(int))
df
代码日期时间产品储罐出库值标志
0 123 2019-06-20 07:00 MS 1 370 350 0
1122019-06-2007:30HS 3340350 1
2123 2019-06-20 07:00 MS 2340 350 0
31232019-06-2007:30HS 4340350 1
41232019-06-2008:00毫秒1470350
51232019-06-2008:30HS 3453500
6123 2019-06-20 08:00 MS 2470 350 0
71232019-06-2008:30HS 44903500
81232019-06-209:30HS 40350
9234 2019-06-209:30 HS 1200 350 1

对我来说,你问的问题很不清楚。如果你想标记为
1
,所有下面有
库存的行都要
出值
,除非它们是
0
,你可以做

df['flag'] = 0
df.loc[(df['stock'] < df['out_value']) & (df['stock'] != 0), 'flag'] = 1
df['flag']=0
df.loc[(df['stock']
MS
at
07:00
at未标记为1,因为储罐=1不小于out_值正确吗?@Erfan这是正确的。如果一个产品映射到一个或多个储罐中,则所有储罐应小于
out_值
field.hmmm,分配vs
df['flag']=
差别太小了,你觉得怎么样?@jezrael我花了相当长的时间写这篇文章。相似性不是巧合-我一直在读你的答案,你进入我的脑海:)transform在这种情况下做了什么?@Neil-它返回与原始
数据帧大小相同的序列-
-所以有可能分配新的列
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
df['flag'] = 0
df.loc[(df['stock'] < df['out_value']) & (df['stock'] != 0), 'flag'] = 1