Pandas多列的groupby和条件检查。

问题描述 投票:0回答:1

我有一个这样的数据框。

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
python-3.x pandas dataframe pandas-groupby
1个回答
2
投票

使用。

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
© www.soinside.com 2019 - 2024. All rights reserved.