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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:42:36