You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:10:34