如何将字典中各DataFrame指定列追加到另一字典对应DataFrame?
问题原因
原代码存在4个核心错误,直接触发KeyError: 'a'以及后续潜在报错:
- 初始
output是空字典,第一次循环时直接访问不存在的output['a']、output['b']键,是触发当前KeyError的直接原因 concat是pandas的顶层函数,不是DataFrame对象的实例方法,不能通过df.concat()的形式调用- 列名引用错误:
src[i][a]、src[i][b]中的a/b没有加引号,会被识别为未定义的变量而非列名字符串 - 逻辑错误:
output字典的键只有'a'和'b',不存在和src键对应的整数i键,访问output[i]本身也是非法操作
修正方案
推荐先收集所有同名列再一次性拼接,避免循环中反复修改DataFrame,执行效率更高:
import pandas as pd # 原示例src字典构造 src = {} for i in range(1,4): src[i] = pd.DataFrame({'a':[i, 2*i, 3*i], 'b':[10*i, 20*i, 30*i], 'c':[100*i, 200*i, 300*i]}) # 修正后的output构造逻辑 output = {} # 遍历需要提取的列名 for col in ['a', 'b']: # 收集所有src中对应列,按列方向拼接 output[col] = pd.concat([df[col] for df in src.values()], axis=1)
运行效果
执行后output字典内容如下:
output['a']:
a a a 0 1 2 3 1 2 4 6 2 3 6 9
output['b']:
b b b 0 10 20 30 1 20 40 60 2 30 60 90
如果需要区分每列的来源,可以在拼接时重命名列,将列名和src的键值绑定:
output = {} for col in ['a', 'b']: col_list = [] for k, df in src.items(): tmp_col = df[col].rename(f"{col}_{k}") col_list.append(tmp_col) output[col] = pd.concat(col_list, axis=1)
此时output['a']的列名会变为a_1/a_2/a_3,可以直观识别数据来自哪个源DataFrame。
内容的提问来源于stack exchange,提问作者David H. J.
相关产品推荐
相关产品推荐

