如何用Python/Pandas将横向多组DoB/Name数据转置为多行?
用Pandas实现横向多组数据转纵向结构
直接用Pandas的wide_to_long函数就能搞定,分两种常见情况给你实操代码:
情况1:列名带分组编号(比如DoB_1、Name_1)
如果你的原始表格列名是Company ID加上带编号的DoB_n、Name_n(比如DoB_1、Name_1到DoB_8、Name_8,对应最多8组实体),直接按以下步骤来:
import pandas as pd # 读取你的数据,实际换成pd.read_csv("你的文件路径.csv") df = pd.DataFrame({ 'Company ID': ['C001', 'C002', 'C003'], 'DoB_1': ['1990-01-01', '1985-05-10', None], 'Name_1': ['Alice', 'Bob', None], 'DoB_2': ['1992-03-15', None, None], 'Name_2': ['Charlie', None, None] }) # 执行转换 result = pd.wide_to_long( df, stubnames=['DoB', 'Name'], # 列名的前缀部分 i='Company ID', # 作为主键的列 j='group', # 生成的分组编号列名 sep='_' # 前缀和编号的分隔符 ).reset_index() # 过滤掉空的实体行(原表格中没有对应数据的行) result = result.dropna(subset=['DoB', 'Name'], how='all') # 不需要分组编号的话就删掉这列 result = result.drop(columns='group') # 输出结果或者保存到文件 print(result) # result.to_csv("转换后的数据.csv", index=False)
情况2:列名不带编号(纯重复的DoB、Name)
如果你的原始表格列名是Company ID之后跟着重复的DoB、Name(没有编号),先给列名加上编号再转换:
import pandas as pd # 读取数据 df = pd.read_csv("你的文件路径.csv") # 给重复的DoB、Name列添加分组编号 cols = [] dob_idx = 1 name_idx = 1 for col in df.columns: if col == 'DoB': cols.append(f'DoB_{dob_idx}') dob_idx += 1 elif col == 'Name': cols.append(f'Name_{name_idx}') name_idx += 1 else: cols.append(col) df.columns = cols # 后续步骤和情况1完全一致 result = pd.wide_to_long( df, stubnames=['DoB', 'Name'], i='Company ID', j='group', sep='_' ).reset_index().dropna(subset=['DoB', 'Name'], how='all').drop(columns='group') result.to_csv("转换后的数据.csv", index=False)
非代码方案(一次性操作更省事)
不想写代码的话,用Excel的Power Query就能搞定:
- 选中原始数据区域,点击「数据」选项卡→「从表格/区域」
- 在Power Query编辑器里,选中所有
DoB和Name列,点击「转换」选项卡→「逆透视列」→「逆透视其他列」 - 如果是无编号的重复列,把生成的「属性」列拆分(按重复规律),再整理成
DoB和Name两列,最后点击「关闭并上载」就能得到纵向数据
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

