使用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
相关产品推荐
相关产品推荐

