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

如何将Python字典按键匹配列名追加至Pandas DataFrame

解决API返回字典结构不一致的DataFrame追加问题

嘿,我明白你遇到的问题了——对接API返回的字典结构不固定,想把它们都塞进同一个DataFrame里,缺的键就留空。其实不用像你之前那样把字典拆成单个键值对去逐个赋值,有更简洁高效的方法搞定!

方法一:一次性生成目标DataFrame(推荐)

如果能一次性拿到所有API返回的字典,直接用pd.DataFrame.from_records()就能一步到位,它会自动匹配列名,缺失的键对应的位置自动留空:

import pandas as pd

# 你的API返回字典
r1 = {'C1':20,'C2':15,'C3':10,'C4':53}
r2 = {'C1':47,'C3':26,'C4':17}
r3 = {'C2':31,'C3':64,'C4':29}
r4 = {'C1':64,'C2':17}
r5 = {'C1':45,'C2':24,'C3':71,'C4':63}

# 把所有字典放进一个列表
all_records = [r1, r2, r3, r4, r5]

# 直接生成DataFrame,指定列名确保顺序和你要的一致
df = pd.DataFrame.from_records(all_records, columns=['C1','C2','C3','C4'])

# 如果你希望把pandas默认的NaN转换成示例中的None,可以加这一行
df = df.where(pd.notnull(df), None)

print(df)

运行后就会得到你想要的结果:

C1     C2     C3     C4
0    20     15     10     53
1    47   None     26     17
2  None     31     64     29
3    64     17   None   None
4    45     24     71     63

方法二:循环逐行追加(适合分批获取数据)

如果API数据是分批返回的,需要循环逐个追加,用pd.concat()替代已被弃用的append()方法更稳妥:

import pandas as pd

# 初始化空DataFrame
df = pd.DataFrame(columns=['C1','C2','C3','C4'])

all_records = [r1, r2, r3, r4, r5]

for record in all_records:
    # 把单个字典转成单行DataFrame,然后追加到原DataFrame
    df = pd.concat([df, pd.DataFrame([record])], ignore_index=True)

# 可选:转换NaN为None
df = df.where(pd.notnull(df), None)

print(df)

这个方法和一次性生成的结果完全一样,而且更灵活,适合数据分批到来的场景。

为什么不推荐你之前的方法?

你之前把单个字典拆成[{'C1':20},{'C2':15}]这种列表再逐个赋值,不仅代码繁琐,而且多次调用loc会降低效率,尤其是数据量较大的时候。上面的两种方法都是利用pandas的原生功能,更简洁也更高效。

内容的提问来源于stack exchange,提问作者ortunoa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:27:27