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

如何使用Python和Pandas将多列转换为含多条记录的两列数据集?

Pandas多列转两列(行展开)解决方案

需求说明

将4列结构的数据转换为2列结构:第一列保留原始编号,第二列展开原始行中所有名称项,每个编号与对应名称一一配对生成新行。

原始数据

data = [['123', 'Billy', 'Bill', 'Bi'],
        ['234', 'James', 'J', 'Ji'],
        ['543', 'Floyd', 'Flo', 'F'],
]

processed_data = ?

needed_df = pandas.DataFrame(processed_data, columns=['Number', 'Name'])

期望结果

['123', 'Billy']
['123', 'Bill']
['123', 'Bi']
['234', 'James']
['234', 'J']
['234', 'Ji']
['543', 'Floyd']
['543', 'Flo']
['543', 'F']

错误尝试分析

你使用的嵌套循环遍历了所有列(包括编号列),且concat调用方式错误,导致生成大量冗余数据:

for row in df.iterrows():
    for col in df.columns:
        new_row = ...
        processed_df = pandas.concat(df, new_row)

正确实现方法

方法1:使用Pandas melt函数(推荐)

这是Pandas处理列转行的标准方法,简洁高效:

import pandas as pd

# 先构建原始DataFrame
df = pd.DataFrame(data, columns=['Number', 'Name1', 'Name2', 'Name3'])

# 转换结构:保留Number列,将其他列展开为Name列
processed_df = df.melt(
    id_vars=['Number'],  # 保留的标识列
    value_name='Name'    # 展开后的列名
).drop(columns=['variable'])  # 删除多余的变量标识列

# 重置索引(可选)
processed_df = processed_df.reset_index(drop=True)

方法2:正确的嵌套循环写法

如果需要用循环实现,只需遍历每行的名称项(跳过编号列):

import pandas as pd

processed_data = []
for row in data:
    number = row[0]
    # 遍历当前行的所有名称(从第2个元素开始)
    for name in row[1:]:
        processed_data.append([number, name])

needed_df = pd.DataFrame(processed_data, columns=['Number', 'Name'])

方法3:使用Pandas explode函数

通过将多行名称合并为列表,再展开列表实现:

import pandas as pd

df = pd.DataFrame(data, columns=['Number', 'Name1', 'Name2', 'Name3'])

# 将后三列的名称合并为一个列表列
df['Name'] = df[['Name1', 'Name2', 'Name3']].values.tolist()

# 展开列表列,生成目标结构
processed_df = df[['Number', 'Name']].explode('Name').reset_index(drop=True)

内容的提问来源于stack exchange,提问作者Devcool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:45:34