如何通过循环为DataFrame添加多值并重复行
实现方案
首先把分散的姓名-物品列表整理成字典,方便通过姓名快速索引:
name_picks = { 'Jason': ['chair', 'table', 'pencil'], 'Miguel': ['smartphone', 'cake'], 'Johana': ['clock', 'paper'] }
假设你的原始DataFrame定义如下(如果是从数据库读取的,直接用读取后的对象即可):
import pandas as pd df = pd.DataFrame({ 'id': [1, 2, 3], 'name': ['Jason', 'Miguel', 'Johana'] })
高效循环实现(适合大数据量)
用列表预先存储所有结果行,最后一次性转为DataFrame,避免循环中频繁修改原DataFrame带来的性能损耗:
# 初始化空列表存储结果 result_rows = [] # 用itertuples遍历行,比iterrows性能更优 for row in df.itertuples(index=False): current_name = row.name # 获取当前姓名对应的物品列表,不存在则返回空列表 picks = name_picks.get(current_name, []) # 遍历物品列表,生成新行 for pick in picks: result_rows.append({ 'id': row.id, 'name': current_name, 'picks': pick }) # 转换为最终DataFrame final_df = pd.DataFrame(result_rows)
输出结果
运行后final_df的结构与你要求的目标完全一致:
| id | name | picks |
|---|---|---|
| 1 | Jason | chair |
| 1 | Jason | table |
| 1 | Jason | pencil |
| 2 | Miguel | smartphone |
| 2 | Miguel | cake |
| 3 | Johana | clock |
| 3 | Johana | paper |
补充说明
如果不限制必须用循环,Pandas内置的explode方法会更简洁高效:
# 先将物品列表映射到原DataFrame df['picks'] = df['name'].map(name_picks) # 展开列表为多行 final_df = df.explode('picks').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Jimmy Auris
相关产品推荐
相关产品推荐

