如何使用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 code123
产品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
at07:00
at未标记为1,因为储罐=1不小于out_值正确吗?@Erfan这是正确的。如果一个产品映射到一个或多个储罐中,则所有储罐应小于out_值
field.hmmm,分配vsdf['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