如何拆分嵌套列表元素并将单列拆分为多列(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的目标表格。 - 拟定实现步骤:
- 拆分Columns_A和Columns_B为3列;
- 合并pass_one、pass_two、pass_three三个数据集;
- 将Columns_C和Columns_D追加到最长的列表中。
当前问题:编写Python代码后无报错,但pass_two和pass_three输出为空,需修正实现逻辑。
原始数据
| Columns_A | Columns_B | Columns_C | Columns_D |
|---|---|---|---|
| 1 | A | X | Y |
| 1 | A | X | Y |
| 1 | A | X | Y |
| 2 | B | X | Y |
| 2 | B | X | Y |
| 3 | C | X | Y |
| 3 | C | X | Y |
| 3 | C | X | Y |
| 3 | C | X | Y |
| 11 | D | Z | Q |
| 12 | E | Z | Q |
| 12 | E | Z | Q |
| 12 | E | Z | Q |
| 13 | F | Z | Q |
| 13 | F | Z | Q |
期望输出
| Columns_A_1 | Columns_B_1 | Columns_A_2 | Columns_B_2 | Columns_A_3 | Columns_B_3 | Columns_C | Columns_D |
|---|---|---|---|---|---|---|---|
| 1 | A | 2 | B | 3 | C | X | Y |
| 1 | A | 2 | B | 3 | C | X | Y |
| 1 | A | Blank | Blank | 3 | C | X | Y |
| Blank | Blank | Blank | Blank | 3 | C | X | Y |
| 11 | D | 12 | E | 13 | F | Z | Q |
| Blank | Blank | 12 | E | 13 | F | Z | Q |
| Blank | Blank | 12 | E | Blank | Blank | Z | Q |
尝试的代码
#①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)对的重复次数对齐需求。
正确实现方案
实现思路
- 按
Columns_C分组,每组内处理对应的数据; - 对每个分组,提取唯一的(A,B)对,并统计每个对的出现次数;
- 以分组内最大的出现次数为基准,对每个(A,B)对生成填充列表,不足的位置用"Blank"补充;
- 横向拼接三个(A,B)对的填充列表,再添加
Columns_C和Columns_D的常量列; - 合并所有分组的结果,得到最终表格。
代码实现
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
相关产品推荐
相关产品推荐

