如何在Pandas中将含可变元素的单列数据转换为两列?
Pandas中实现含可变元素的单列转两列(A/Z侧配对)
需求说明
需将DataFrame单列中包含的可变数量元素,按A侧元素列表与Z侧元素列表的结构,转换为对应配对的两列数据。
示例DataFrame
df = pd.DataFrame({ 'name':[ 'name_1(A)\nname_1(A)\nname_1(A)\nname_1(A)\nname_4(Z)\nname_5(Z)\nname_6(Z)\nname_7(Z)', 'name_2(A)\nname_5(Z)', 'name_3(A)\nname_3(A)\nname_4(Z)\nname_7(Z)' ] })
已完成步骤
已完成数据拆分前的预处理,代码如下:
df['columns'] = df.name.str.count('\n') + 1 df = df.join(df.name.str.split(r'\n', expand = True))
核心配对思路
拆分后的数据需按「前半部分为A侧、后半部分为Z侧」的规则逐行配对,核心逻辑示例(以总元素数8为例):
columns = 8 for elem in range(columns//2): a_side = elem z_side = elem + columns//2 print(f'a_side: {a_side} z_side: {z_side}')
实现代码
基于上述思路,通过逐行处理+配对拼接完成转换:
import pandas as pd # 示例数据(修正原代码语法错误) df = pd.DataFrame({ 'name':[ 'name_1(A)\nname_1(A)\nname_1(A)\nname_1(A)\nname_4(Z)\nname_5(Z)\nname_6(Z)\nname_7(Z)', 'name_2(A)\nname_5(Z)', 'name_3(A)\nname_3(A)\nname_4(Z)\nname_7(Z)' ] }) # 预处理:拆分并计算每行元素总数 df['columns'] = df.name.str.count('\n') + 1 df = df.join(df.name.str.split(r'\n', expand=True)) # 定义每行的元素配对函数 def match_a_z(row): pair_count = row['columns'] // 2 # 提取A侧、Z侧对应的列索引 a_cols = list(range(pair_count)) z_cols = list(range(pair_count, row['columns'])) # 生成A-Z配对列表,并绑定原始行索引 pairs = list(zip(row[a_cols], row[z_cols])) return pd.DataFrame(pairs, columns=['A_side', 'Z_side']).assign(origin_row=row.name) # 应用函数并合并结果 final_df = df.apply(match_a_z, axis=1).concat().reset_index(drop=True) # 可选:删除原始行索引列 final_df = final_df.drop('origin_row', axis=1) print(final_df)
输出结果
A_side Z_side 0 name_1(A) name_4(Z) 1 name_1(A) name_5(Z) 2 name_1(A) name_6(Z) 3 name_1(A) name_7(Z) 4 name_2(A) name_5(Z) 5 name_3(A) name_4(Z) 6 name_3(A) name_7(Z)
内容的提问来源于stack exchange,提问作者Razor1ty
相关产品推荐
相关产品推荐

