如何在Pandas中批量合并名称相似的对应列?
批量合并DataFrame中数值与单位列
我有一个结构如下的DataFrame:
import pandas as pd df = pd.DataFrame({"a.1":[1, 2, 3], "a.2": ['mg', 'mg', 'mg'], "b.1": [7, 8, 9], "b.2":['g', 'g', 'g'], "c.1":[4, 5, 6], "c.2":["lb", "lb", "lb"]})
其中,以.1结尾的列是数值,对应以.2结尾的列中的单位。我希望按a.1与a.2、b.1与b.2、c.1与c.2的模式合并列,将6列合并为3列,每列包含数值与单位的组合。
我目前仅了解如何按条件将多列合并为一列,但想知道是否可以一次性批量合并所有目标列,而非逐对合并?
期望输出如下:
out = pd.DataFrame({"a": ["1mg", "2mg", "3mg"], "b": ["7g", "8g", "9g"], "c": ["4lb", "5lb", "6lb"]})
方法1:按列名前缀循环批量处理
提取列名的前缀(如a、b、c),遍历前缀完成对应列的拼接:
# 提取并排序所有列名的前缀 prefixes = sorted(set(col.split('.')[0] for col in df.columns)) # 初始化结果DataFrame result = pd.DataFrame() # 批量拼接每一对数值-单位列 for prefix in prefixes: result[prefix] = df[f"{prefix}.1"].astype(str) + df[f"{prefix}.2"]
方法2:用groupby按前缀分组聚合
利用groupby按列名前缀分组,通过聚合函数一次性完成所有拼接:
# 按列名前缀分组,对每组的两列执行拼接操作 result = df.groupby(lambda col: col.split('.')[0], axis=1).agg( lambda x: x.iloc[:, 0].astype(str) + x.iloc[:, 1] )
这里lambda col: col.split('.')[0]用于提取列名前缀作为分组键,axis=1指定按列分组,聚合函数中取每组第一列(数值列)转字符串后与第二列(单位列)拼接。
方法3:重塑DataFrame后拼接(适用于复杂结构)
先将宽表转长表,分组拼接后再转回宽表:
# 重置索引并转长格式 df_long = df.reset_index().melt(id_vars='index', var_name='col', value_name='val') # 拆分列名为前缀和类型(数值/单位) df_long[['prefix', 'type']] = df_long['col'].str.split('.', expand=True) # 按索引和前缀分组拼接,再转回宽格式 result = df_long.groupby(['index', 'prefix'])['val'].agg(''.join).unstack('prefix').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者stryduh
相关产品推荐
相关产品推荐

