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

如何拆分嵌套列表元素并将单列拆分为多列(Python实现)

数据拆分与合并实现方案

需求说明

  • 将数据中的Columns_A和Columns_B拆分为3组列,最终生成包含Columns_A_1、Columns_B_1、Columns_A_2、Columns_B_2、Columns_A_3、Columns_B_3、Columns_C、Columns_D的目标表格。
  • 拟定实现步骤:
    1. 拆分Columns_A和Columns_B为3列;
    2. 合并pass_one、pass_two、pass_three三个数据集;
    3. 将Columns_C和Columns_D追加到最长的列表中。

当前问题:编写Python代码后无报错,但pass_two和pass_three输出为空,需修正实现逻辑。

原始数据

Columns_AColumns_BColumns_CColumns_D
1AXY
1AXY
1AXY
2BXY
2BXY
3CXY
3CXY
3CXY
3CXY
11DZQ
12EZQ
12EZQ
12EZQ
13FZQ
13FZQ

期望输出

Columns_A_1Columns_B_1Columns_A_2Columns_B_2Columns_A_3Columns_B_3Columns_CColumns_D
1A2B3CXY
1A2B3CXY
1ABlankBlank3CXY
BlankBlankBlankBlank3CXY
11D12E13FZQ
BlankBlank12E13FZQ
BlankBlank12EBlankBlankZQ

尝试的代码

#①breakdown Columns_A and Columns_B into 3 columns
!pip install pandas
import pandas as pd

dic = {'Column_A': ["\"1\"","\"1\"","\"1\"","\"2\"","\"2\"","\"3\"","\"3\"","\"3\"","\"3\"","\"11\"","\"12\"","\"12\"","\"12\"","\"13\"","\"13\""],
    'Column_B': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'E', 'E', 'E', 'F', 'F'],
    'Column_C': ['X'] * 9 + ['Z'] * 6,
    'Column_D': ['Y'] * 9 + ['Q'] * 6,}
df = pd.DataFrame(dic)
list_data = df.values.tolist()

pass_one = [] #Columns_A_1 and Columns_A_1 
pass_two = [] #Columns_A_2 and Columns_B_2
pass_three = [] #Columns_A_3 and Columns_B_3

for row in list_data:
    Columns_A = row[0]
    Columns_B = row[1]
    Columns_C = row[2]
    Columns_D = row[3]
    list_one = [Columns_A ,Columns_B] #I would like to append these data set
    if Columns_C in Columns_C and Columns_A not in Columns_A:
        pass_two.append(list_one)
        if Columns_C in Columns_C and Columns_A not in Columns_A:
            pass_three.append(list_one)
    else:
        pass_one.append(list_one)

问题分析

原代码的核心错误在于判断条件:

  • Columns_C in Columns_C:单个字符串值在自身中永远为True,无实际判断意义;
  • Columns_A not in Columns_A:同样,单个值不在自身中永远为False,导致永远进入else分支,pass_two和pass_three始终为空。
  • 整体逻辑未按Columns_C分组处理,也未考虑每组内不同(A,B)对的重复次数对齐需求。

正确实现方案

实现思路

  1. 按Columns_C分组,每组内处理对应的数据;
  2. 对每个分组,提取唯一的(A,B)对,并统计每个对的出现次数;
  3. 以分组内最大的出现次数为基准,对每个(A,B)对生成填充列表,不足的位置用"Blank"补充;
  4. 横向拼接三个(A,B)对的填充列表,再添加Columns_C和Columns_D的常量列;
  5. 合并所有分组的结果,得到最终表格。

代码实现

import pandas as pd

# 初始化数据,清理Column_A的引号
dic = {
    'Column_A': ["\"1\"","\"1\"","\"1\"","\"2\"","\"2\"","\"3\"","\"3\"","\"3\"","\"3\"","\"11\"","\"12\"","\"12\"","\"12\"","\"13\"","\"13\""],
    'Column_B': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'E', 'E', 'E', 'F', 'F'],
    'Column_C': ['X'] * 9 + ['Z'] * 6,
    'Column_D': ['Y'] * 9 + ['Q'] * 6,
}
df = pd.DataFrame(dic)
df['Column_A'] = df['Column_A'].str.strip('"')  # 清理引号

# 存储最终结果
final_result = pd.DataFrame()

# 按Column_C分组处理
for group_key, group_df in df.groupby('Column_C'):
    # 获取当前分组的Column_D值(同一分组值相同)
    col_d = group_df['Column_D'].iloc[0]
    
    # 按(A,B)分组,统计每个对的出现次数
    ab_groups = group_df.groupby(['Column_A', 'Column_B']).size().reset_index(name='counts')
    # 获取最大次数,作为填充后的列表长度
    max_count = ab_groups['counts'].max()
    
    # 为每个(A,B)对生成填充后的列表
    filled_ab = []
    for _, row in ab_groups.iterrows():
        a_val = row['Column_A']
        b_val = row['Column_B']
        count = row['counts']
        # 生成列表:前count个是对应值,后面补Blank
        a_list = [a_val] * count + ['Blank'] * (max_count - count)
        b_list = [b_val] * count + ['Blank'] * (max_count - count)
        filled_ab.append((a_list, b_list))
    
    # 确保有3组,不足的补全Blank列表
    while len(filled_ab) < 3:
        filled_ab.append((['Blank']*max_count, ['Blank']*max_count))
    
    # 拼接成当前分组的DataFrame
    group_result = pd.DataFrame({
        'Columns_A_1': filled_ab[0][0],
        'Columns_B_1': filled_ab[0][1],
        'Columns_A_2': filled_ab[1][0],
        'Columns_B_2': filled_ab[1][1],
        'Columns_A_3': filled_ab[2][0],
        'Columns_B_3': filled_ab[2][1],
        'Columns_C': [group_key]*max_count,
        'Columns_D': [col_d]*max_count
    })
    
    # 添加到最终结果
    final_result = pd.concat([final_result, group_result], ignore_index=True)

# 打印结果
print(final_result)

输出验证

运行上述代码后,输出结果与期望表格完全一致,可通过final_result.to_csv()保存为文件或直接查看。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:51:32