基于行非零值过滤pandas DataFrame

vdgimpew  于 2023-05-05  发布在  其他
关注(0)|答案(2)|浏览(125)

我有一个pandas df如下:

date X1 X2 X3  Y  user
1/1   0  3 34  5   a
2/1   0  7 65  5   a
3/1   0 13  0  5   a
4/1  25  4 65  0   a
5/1  35  0  0  5   a
6/1   4  6  9  0   a
7/1   0  0  0  5   a
1/1   0  0 34  5   b
2/1   0  7 65  5   b
3/1   0 13  0  5   b
4/1   0  4 65  5   b
5/1  35  0  0  5   b
6/1   4  6  9  0   b
7/1   0  0  0  0   b

如何使用groupby(),仅在所有Xs开始出现非零值后才使用select rows per user。在这种情况下,对于用户a,仅选择dates4/15/16/17/1的行,对于用户b,仅选择dates6/17/1的行。谢谢大家。

eqqqjvef

eqqqjvef1#

你可以这样做

df.groupby('user') \
  .apply(lambda s: s[s.filter(like='X').ne(0).all(1).cumsum().ge(1)]))
date  X1  X2  X3  Y user
user                            
a    3   4/1  25   4  65  0    a
     4   5/1  35   0   0  5    a
     5   6/1   4   6   9  0    a
     6   7/1   0   0   0  5    a
b    12  6/1   4   6   9  0    b
     13  7/1   0   0   0  0    b
bqjvbblv

bqjvbblv2#

另一种可能的解决方案是使用cummaxboolean indexing

#are all the `X`s not equal to 0 ?
m = df.filter(like="X").ne(0).all(axis=1)
​
out = df.loc[m.groupby(df["user"]).cummax()]

输出:

print(out)

   date  X1  X2  X3  Y user
3   4/1  25   4  65  0    a
4   5/1  35   0   0  5    a
5   6/1   4   6   9  0    a
6   7/1   0   0   0  5    a
12  6/1   4   6   9  0    b
13  7/1   0   0   0  0    b

相关问题