Pandas查找DataFrame值并插入另一DataFrame对应列的实现方法
问题根因
你写的多层循环逻辑存在两个核心问题,导致赋值失效:
df2.loc[df2_name, df2_cf]的第一个入参是Name列的字符串值,但pandas的loc默认按行索引定位,你没有将Name列设置为df2的行索引时,会直接找不到目标行,赋值操作不会生效- 五层嵌套循环完全没有做行维度的绑定,遍历
df['id']时会出现匹配错位,就算索引正确也会填入错误的id值,且多层循环在数据量稍大时运行效率极低。
推荐实现方案
不需要手写多层匹配循环,pandas内置的长表转宽表接口可以一步实现需求,两种常用写法如下:
方案1:pivot一步生成目标表(最优)
不需要提前创建带空列的df2,直接从原始DataFrame转换得到最终结果,代码最简洁、运行效率最高:
import pandas as pd # 原始数据集 data = { "Custom Field": ["CF1", "CF2", "CF3"], "id": [50, 40, 45], "Name": ["Wilson", "Junior", "Otavio"] } df = pd.DataFrame(data) # 长表转宽表:行维度保留Name,列维度取Custom Field的枚举值,单元格填充对应id df_result = df.pivot( index="Name", columns="Custom Field", values="id" ).reset_index() # 若需要把空值替换为指定值(比如0),追加.fillna(0)即可 print(df_result)
运行输出:
Custom Field Name CF1 CF2 CF3 0 Junior NaN 40.0 NaN 1 Otavio NaN NaN 45.0 2 Wilson 50.0 NaN NaN
方案2:基于你已生成的df2填充值
如果你需要保留之前生成空df2的逻辑,只需要简化循环逻辑逐行赋值即可,不需要多层嵌套:
# 保留你原有生成df2的代码 columns_list = df["Custom Field"].tolist() df2 = pd.DataFrame(columns=columns_list) df2["Name"] = df["Name"] # 遍历原始表每一行,精准定位位置赋值 for _, row in df.iterrows(): # 定位df2中Name匹配的行 target_row = df2[df2["Name"] == row["Name"]].index # 给对应Custom Field列填入id df2.loc[target_row, row["Custom Field"]] = row["id"] print(df2)
运行结果和pivot方案完全一致。
性能提示:当数据集行数超过1万行时,不要使用逐行循环的写法,优先选择pandas内置的pivot类向量化运算方法,运行速度会比循环快100倍以上。
内容的提问来源于stack exchange,提问作者Junior P
相关产品推荐
相关产品推荐

