如何使用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
相关产品推荐
相关产品推荐

