如何合并含NA的重复列并保留其他列?(Pandas处理Selenium导出DataFrame)
解决Pandas中名称相似重复列的合并与NA填充问题
核心思路
把名称相似的重复列(如XXiF/XXiF.1)按基础列名分组,每组内通过横向填充NA值合并为一列,同时保留player、game_id这类非重复列。
具体实现代码
假设你的原始DataFrame结构如下(模拟示例):
import pandas as pd import re # 模拟用户的原始DataFrame df = pd.DataFrame({ 'player': ['Alice', 'Bob', 'Charlie'], 'game_id': [202401, 202402, 202403], 'XXiF': [15, pd.NA, 35], 'XXiF.1': [pd.NA, 25, pd.NA], 'YYiT': [pd.NA, 55, pd.NA], 'YYiT.1': [45, pd.NA, 65] })
步骤1:提取列名的基础部分,对列分组
用正则去掉列名末尾的.数字后缀,将同基础名的列归为一组:
def get_base_column_name(col): # 匹配末尾的 .1/.2 等后缀并移除 return re.sub(r'\.\d+$', '', col) # 按基础列名分组 column_groups = {} for col in df.columns: base_name = get_base_column_name(col) if base_name not in column_groups: column_groups[base_name] = [] column_groups[base_name].append(col)
步骤2:处理每组列,合并并填充NA
对每组列,若只有一列直接保留;若有多列,横向用非NA值填充后合并为一列:
processed_columns = [] for base_name, cols in column_groups.items(): if len(cols) == 1: # 非重复列直接加入结果 processed_columns.append(df[cols[0]]) else: # 横向填充NA:用后面列的有效值填充前面列的NA,最后取第一列(已完成填充) merged_col = df[cols].bfill(axis=1).iloc[:, 0] merged_col.name = base_name # 恢复原始列名 processed_columns.append(merged_col)
步骤3:合并所有列得到最终结果
final_df = pd.concat(processed_columns, axis=1)
最终效果
处理后final_df会保留player、game_id,并将XXiF/XXiF.1合并为无NA的XXiF列,YYiT/YYiT.1合并为无NA的YYiT列,完全匹配你的期望输出。
补充说明
- 该方法支持任意数量的重复后缀列(如
XXiF.1/XXiF.2),都会自动完成横向填充合并。 - 你之前尝试的
pd.concat/df.merge是针对数据集拼接或键合并,df.extract是文本提取,均不适用这种同组列的NA填充场景,所以无法解决问题。
内容的提问来源于stack exchange,提问作者Octa
相关产品推荐
相关产品推荐

