【问题标题】:Pandas groupby and conditional check on multiple columnsPandas groupby 和多列的条件检查
【发布时间】:2020-05-06 11:18:46
【问题描述】:

我有一个这样的数据框:

id date         status value
1  2009-06-17   1      NaN  
1  2009-07-17   B      NaN 
1  2009-08-17   A      NaN 
1  2009-09-17   5      NaN 
1  2009-10-17   0      0.55
2  2010-07-17   B      NaN 
2  2010-08-17   A      NaN 
2  2010-09-17   0      0.00

现在我想按 id 分组,然后检查在状态更改为 A 后值是否变为非零。因此对于 id=1 的组,状态确实更改为 A 并且之后(就日期而言)该值也变为非零。但是对于 id=2 的组,即使状态变为 A 后,值也不会变为非零。请注意,如果状态没有变为 A,那么我什至不需要检查值。

所以最后我想要一个像这样的新数据框:

id check
1  True
2  False

【问题讨论】:

  • A 之后是否需要测试下一个值?
  • 不,不一定是A之后的下一个值,后面的值也可以变为非零
  • @jezrael 我已经编辑了问题以反映这一点
  • 有可能0A在同一行,那么输出True
  • @jezrael 这永远不会发生,但即使发生了,是的,输出将是 True

标签: python-3.x pandas dataframe pandas-groupby


【解决方案1】:

用途:

print (df)
   id        date status  value
0   1  2009-06-17      1    NaN
1   1  2009-07-17      B    NaN
2   1  2009-08-17      A    NaN
3   1  2009-09-17      5    NaN
4   1  2009-10-17      0   0.55
5   2  2010-07-17      B    NaN
6   2  2010-08-17      A    NaN
7   2  2010-09-17      0   0.00
8   3  2010-08-17      R    NaN
9   3  2010-09-17      0   0.00

idx = df['id'].unique()
#filter A values
m = df['status'].eq('A')
#filter all rows after A per groups
df1 = df[m.groupby(df['id']).cumsum().gt(0)]
print (df1)
   id        date status  value
2   1  2009-08-17      A    NaN
3   1  2009-09-17      5    NaN
4   1  2009-10-17      0   0.55
6   2  2010-08-17      A    NaN
7   2  2010-09-17      0   0.00

#compare by 0 and test if no 0 value per group and last added all posible id by reindex
df2 = (df1['value'].ne(0)
                   .groupby(df1['id'])
                   .all()
                   .reindex(idx, fill_value=False)
                   .reset_index(name='check'))
print (df2)
   id  check
0   1   True
1   2  False
2   3  False

【讨论】:

  • df 有大约 3000 个唯一 ID,但 df2 只有 1000 个?也许你在过滤时错过了一些。它们也应该在 df2 中,检查为 False
  • @Ank - 我知道是什么问题,没有A 组,全部删除。
  • @Ank - 通过 id 的原始唯一值为 reindex 添加了此问题的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2019-04-04
  • 2022-07-11
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
相关资源
最近更新 更多