You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用groupby按用户筛选Pandas DataFrame所有X列非零值后的行

解决方案

步骤说明

  1. 标记全非零X列的行:创建布尔列,标记每行的X1、X2、X3是否全部为非零值。
  2. 按用户分组计算累积真值:对每个用户组,计算布尔列的累积最大值——一旦出现第一个全非零的行,后续所有行都会被标记为保留。
  3. 筛选结果:使用累积真值的掩码过滤原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:15:04