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

使用Pandas实现多列条件行筛选及移除参赛不足2赛季球员

Pandas 实用问题解答

问题1:如何筛选出满足条件的列数≥3的所有行?

这个需求的核心是先统计每行里符合条件的列有多少,再筛选计数达标的行。咱们分场景来拆解:

首先得明确你说的“满足条件”具体是什么——是列值大于某个阈值?还是非空?我给你两个常见场景的解法:

  • 场景1:统计数值列中大于0的列数≥3
    先把数值类型的列挑出来,逐行判断每个列是否满足条件,求和得到每行的达标列数,最后筛选:

    # 筛选所有数值类型的列
    numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
    # 逐行统计大于0的列数
    pass_count = df[numeric_cols].gt(0).sum(axis=1)
    # 留下达标行
    filtered_df = df[pass_count >= 3]
    
  • 场景2:统计非空列数≥3
    把判断逻辑换成非空即可:

    non_null_count = df[numeric_cols].notna().sum(axis=1)
    filtered_df = df[non_null_count >= 3]
    

不管你的条件是什么,只要把gt(0)换成对应的布尔判断(比如eq('target')判断等于某个值),就能复用这个逻辑。

问题2:移除参赛赛季不足2个的球员

根据你的例子,我分两种常见的数据结构给出解法:

情况1:数据按赛季拆分,每个球员有多行数据

比如每行是一个球员某赛季的记录,我们先按球员分组统计赛季数,再保留赛季数≥2的球员:

# 假设球员名字存在'player_name'列,赛季列是'season'
# 统计每个球员的不同赛季数量
player_season_counts = df.groupby('player_name')['season'].nunique()
# 筛选出至少打了2个赛季的球员
valid_players = player_season_counts[player_season_counts >= 2].index
# 保留这些球员的所有记录
filtered_df = df[df['player_name'].isin(valid_players)]

情况2:每个球员一行,列是不同赛季的form和appearances

比如列名是12/13_form、12/13_appearances这种,我们先按赛季分组判断该球员是否参加了这个赛季,再统计参赛数:

# 提取所有带赛季标识的列(比如包含'/'的列名)
season_cols = [col for col in df.columns if '/' in col]
# 按赛季分组,只要该赛季的form或appearances非空,就算参赛
season_participation = df[season_cols].groupby(lambda x: x.split('_')[0], axis=1).any()
# 统计每个球员的参赛赛季数
participation_count = season_participation.sum(axis=1)
# 留下参赛≥2个赛季的球员
filtered_df = df[participation_count >= 2]

如果你的参赛判断标准是“appearances大于0”,可以把.any()换成.apply(lambda x: x['appearances'] > 0, axis=1),灵活调整即可。


内容的提问来源于stack exchange,提问作者pandasman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:04:46