pandas - 如何在pandas中使用条件在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 值)。 例如RO 代码 12307:30 日期 2019-06-20 产品 HS 有两个储 jar 34,因此如果两个储 jar 的库存均低于 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

如何在 pandas 中做到这一点?

最佳答案

如果需要检查与非 0 值的差异,然后使用 GroupBy.transform 检查每组的所有 True 值和 GroupBy.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)

关于pandas - 如何在pandas中使用条件在groupby中设置标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57038498/

相关文章:

python - 使用 Pandas DataFrame 将值放在组下方意味着

python - 将字符串在 Pandas 数据框中出现的次数追加到另一列

python - 在 Dask DataFrame 中的分区之间分配行

python - pandas read_csv 忽略分隔符

python - 循环打开和关闭文件

Python Pandas Proc 转置等价物

Pandas 组合来自多列的信息,其中值取决于同一行中的值

python - 通过与另一个重叠来子集 Pandas 数据框

python - 使用 python 将句子中的每个单词替换为单词索引

python - 如何使用 Pandas 将水平数据帧结构转换为垂直结构