如何基于含多值列的DataFrame生成拆分后的新DataFrame
Pandas DataFrame 多列拆分并生成对应新行解决方案
问题场景
现有维度为(5000, 6)的DataFrame df1,需按以下规则拆分生成新行:
- A列按逗号拆分,每个拆分后的值对应一行
- C列按换行符拆分,每个拆分后的值对应一行
- B、D、E、F列直接复制原行对应值
- A列与C列拆分后的多值数量可能不一致(部分行A仅含1个值,部分行两者数量一致)
代码实现
import pandas as pd def process_row(row): # 拆分A列,去除元素前后空格 a_split = [item.strip() for item in row['A'].split(',')] # 拆分C列,过滤空字符串并去除元素前后空格 c_split = [item.strip() for item in row['C'].split('\n') if item.strip()] len_a, len_c = len(a_split), len(c_split) # 处理列长度不一致的情况 if len_a == 1 and len_c > 1: a_split = a_split * len_c elif len_c == 1 and len_a > 1: c_split = c_split * len_a # 若两者长度均大于1且不等,默认截断较长列表至较短长度(可根据需求调整逻辑) else: min_len = min(len_a, len_c) a_split = a_split[:min_len] c_split = c_split[:min_len] # 构建临时DataFrame temp_df = pd.DataFrame({ 'A': a_split, 'C': c_split }) # 复制其他列的值 for col in ['B', 'D', 'E', 'F']: temp_df[col] = row[col] return temp_df # 应用到原DataFrame并合并结果 result_df = pd.concat([process_row(row) for _, row in df1.iterrows()], ignore_index=True)
代码说明
- 列拆分处理:对A列按逗号拆分,对C列按换行符拆分,同时清理元素前后空格及空字符串(避免原数据末尾换行导致无效空值)
- 长度对齐逻辑:
- 若其中一列仅含1个值,将该值重复至与另一列拆分后的长度一致
- 若两列拆分后长度均大于1且不等,默认截断较长列表至较短列表的长度(可根据实际业务需求调整,例如抛出警告或填充缺失值)
- 结果合并:通过
pd.concat将每一行处理后的临时DataFrame合并,生成最终拆分后的DataFrame
测试示例
# 构造测试数据 test_data = { 'A': ['A-0000-ALEX,A-00030-PAUL', 'A-0001-JOHN', 'A-0002-MARY,A-0003-TOM'], 'B': [1, 2, 3], 'C': ['1112-PPAI 12.00: First Name\n4554-ALGF 09:00 Groceries\n', '6667-XYZ 14:00 Dinner\n', '7778-ABC 10:00 Work\n8889-DEF 15:00 Shopping'], 'D': ['d1', 'd2', 'd3'], 'E': ['e1', 'e2', 'e3'], 'F': ['f1', 'f2', 'f3'] } df1 = pd.DataFrame(test_data) # 生成结果 result_df = pd.concat([process_row(row) for _, row in df1.iterrows()], ignore_index=True) print(result_df)
运行后输出的结果符合需求:
A B C D E F 0 A-0000-ALEX 1 1112-PPAI 12.00: First Name d1 e1 f1 1 A-00030-PAUL 1 4554-ALGF 09:00 Groceries d1 e1 f1 2 A-0001-JOHN 2 6667-XYZ 14:00 Dinner d2 e2 f2 3 A-0002-MARY 3 7778-ABC 10:00 Work d3 e3 f3 4 A-0003-TOM 3 8889-DEF 15:00 Shopping d3 e3 f3
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

