如何合并DataFrame中表头含相同子串的列并重命名?
Pandas合并同前缀列并保留首列重命名
原始数据
首先定义初始DataFrame:
import numpy as np import pandas as pd data = pd.DataFrame({ "ColA:1":[12, 20, 31, np.nan, np.nan, np.nan], "ColA:2":[np.nan, np.nan, 28, 78, 23, 25], "ColB":[np.nan, np.nan, 23, 56, 12, 3], "ColC:1":[56, 10, 35, 67, np.nan, np.nan], "ColC:2":[np.nan, 56, 28, 78, 23, np.nan], "ColC:3":[np.nan, np.nan, np.nan, 43, 17, 8] })
初始输出:
ColA:1 ColA:2 ColB ColC:1 ColC:2 ColC:3 0 12.0 NaN NaN 56.0 NaN NaN 1 20.0 NaN NaN 10.0 56.0 NaN 2 31.0 28.0 23.0 35.0 28.0 NaN 3 NaN 78.0 56.0 67.0 78.0 43.0 4 NaN 23.0 12.0 NaN 23.0 17.0 5 NaN 25.0 3.0 NaN NaN 8.0
初步合并(已完成)
通过groupby+bfill完成同前缀列的填充:
df_combined = data.groupby(lambda x: x.split(':')[0], axis=1).bfill()
初步合并后输出:
ColA:1 ColA:2 ColB ColC:1 ColC:2 ColC:3 0 12.0 NaN NaN 56.0 NaN NaN 1 20.0 NaN NaN 10.0 56.0 NaN 2 31.0 28.0 23.0 35.0 28.0 NaN 3 78.0 78.0 56.0 67.0 78.0 43.0 4 23.0 23.0 12.0 23.0 23.0 17.0 5 25.0 25.0 3.0 8.0 8.0 8.0
最终处理:保留每组首列并重命名
基于df_combined,再次按列前缀分组,取每组的第一列即可自动完成重命名:
result = df_combined.groupby(lambda x: x.split(':')[0], axis=1).first()
最终输出:
ColA ColB ColC 0 12.0 NaN 56.0 1 20.0 NaN 10.0 2 31.0 23.0 35.0 3 78.0 56.0 67.0 4 23.0 12.0 23.0 5 25.0 3.0 8.0
一步到位方案
如果不想拆分两步,也可以直接在分组后完成填充、取首列的操作:
result = data.groupby(lambda x: x.split(':')[0], axis=1).apply(lambda g: g.bfill(axis=1).iloc[:, 0])
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

