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

如何合并含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:41:59