如何将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
相关产品推荐
相关产品推荐

