如何用groupby按用户筛选Pandas DataFrame所有X列非零值后的行
解决方案
步骤说明
- 标记全非零X列的行:创建布尔列,标记每行的X1、X2、X3是否全部为非零值。
- 按用户分组计算累积真值:对每个用户组,计算布尔列的累积最大值——一旦出现第一个全非零的行,后续所有行都会被标记为保留。
- 筛选结果:使用累积真值的掩码过滤原DataFrame,得到目标行。
代码实现
import pandas as pd # 构建示例DataFrame data = { 'date': ['1/1', '2/1', '3/1', '4/1', '5/1', '6/1', '7/1', '1/1', '2/1', '3/1', '4/1', '5/1', '6/1', '7/1'], 'X1': [0, 0, 0, 25, 35, 4, 0, 0, 0, 0, 0, 35, 4, 0], 'X2': [3, 7, 13, 4, 0, 6, 0, 0, 7, 13, 4, 0, 6, 0], 'X3': [34, 65, 0, 65, 0, 9, 0, 34, 65, 0, 65, 0, 9, 0], 'Y': [5,5,5,0,5,0,5,5,5,5,5,5,0,0], 'user': ['a']*7 + ['b']*7 } df = pd.DataFrame(data) # 1. 标记X列全非零的行 x_all_nonzero = df[['X1', 'X2', 'X3']].ne(0).all(axis=1) # 2. 按用户分组计算累积真值(首次全非零后所有行都标记为True) keep_mask = df.groupby('user')[x_all_nonzero.name].cummax() # 3. 筛选结果 result = df[keep_mask] print(result)
输出结果
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
内容的提问来源于stack exchange,提问作者Telis
相关产品推荐
相关产品推荐

