基于列表列长度复制并更新DataFrame行的技术方案问询
Pandas批量处理DataFrame行复制与列更新方案
需求说明
处理Pandas DataFrame时需遵循以下规则:
- 依据每行
Column B列的列表长度决定行复制次数:列表长度为n时,额外复制n-1行(如3个元素复制2次,1个元素不复制) - 复制生成的新行需将
Column c更新为列表对应位置的元素(原行保留列表第一个元素,新行依次取列表第2、3...个元素)
原始数据
| Column A | Column B | Column c |
|---|---|---|
| xxxx xxx xx | ['a', 'b', 'c'] | a |
| zzz zz zzzz | ['d', 'e'] | d |
| aa aaa aaa a | ['f'] | f |
期望输出
| Column A | Column B | Column c |
|---|---|---|
| xxxx xxx xx | ['a', 'b', 'c'] | a |
| zzz zz zzzz | ['d', 'e'] | d |
| aa aaa aaa a | ['f'] | f |
| xxxx xxx xx | ['a', 'b', 'c'] | b |
| xxxx xxx xx | ['a', 'b', 'c'] | c |
| zzz zz zzzz | ['d', 'e'] | e |
解决方案
方法1:高效内置函数实现(推荐,适配大数据集)
利用Pandas的explode函数完成批量处理,避免逐行循环,性能更优:
import pandas as pd # 构造原始DataFrame(实际使用时替换为你的数据读取逻辑) data = { 'Column A': ['xxxx xxx xx', 'zzz zz zzzz', 'aa aaa aaa a'], 'Column B': [['a', 'b', 'c'], ['d', 'e'], ['f']], 'Column c': ['a', 'd', 'f'] } df = pd.DataFrame(data) # 生成需要新增的行:提取列表中除第一个元素外的剩余元素并展开 df['_temp_items'] = df['Column B'].apply(lambda x: x[1:]) expanded_rows = df.explode('_temp_items').dropna(subset=['_temp_items']) # 更新新增行的Column c字段 expanded_rows['Column c'] = expanded_rows['_temp_items'] # 合并原始数据与新增行,清理临时列并重置索引 result_df = pd.concat([df, expanded_rows.drop('_temp_items', axis=1)], ignore_index=True) # 查看结果 print(result_df)
方法2:逐行循环实现(适合小数据集或调试)
如果需要更直观的逻辑展示,可使用逐行循环的方式:
import pandas as pd # 构造原始DataFrame data = { 'Column A': ['xxxx xxx xx', 'zzz zz zzzz', 'aa aaa aaa a'], 'Column B': [['a', 'b', 'c'], ['d', 'e'], ['f']], 'Column c': ['a', 'd', 'f'] } df = pd.DataFrame(data) new_rows = [] for _, row in df.iterrows(): # 遍历列表中除第一个元素外的剩余元素,生成新行 for item in row['Column B'][1:]: new_row = row.copy() new_row['Column c'] = item new_rows.append(new_row) # 合并数据 result_df = pd.concat([df, pd.DataFrame(new_rows)], ignore_index=True) print(result_df)
内容的提问来源于stack exchange,提问作者user22391597
相关产品推荐
相关产品推荐

