我有以下字典:
dct = { (1/1 , 2/1, 'AAPL') : pd.DataFrame({'aapl' : [1,2,3]}),
(1/1, 2/1 , 'XOM') : pd.DataFrame({'xom' : [4,5,6]}) }
我想要做的是根据键的前2个值来连接数据帧(例如,如果1/1和2/1是键之间的匹配,那么将这些帧连接起来。)
结果应该如下:
dct = { (1/1 , 2/1) : pd.DataFrame({'aapl' : [1,2,3], 'xom' : [4,5,6] })
答案 0 :(得分:4)
defaultdict
是一种方法:
from collections import defaultdict
import pandas as pd
# initialize defaultdict with an empty data frame as default value
result = defaultdict(pd.DataFrame)
for k, v in dct.items():
result[k[:2]] = pd.concat([result[k[:2]], v], axis=1)
result
#defaultdict(pandas.core.frame.DataFrame, {('1/1', '2/1'): aapl xom
# 0 1 4
# 1 2 5
# 2 3 6})
答案 1 :(得分:2)
使用pd.concat
然后使用词典理解来迭代groupby
。
d = pd.concat(dct, axis=1)
d.columns = d.columns.droplevel(2)
{k: v.xs(k, 1) for k, v in d.groupby(axis=1, level=[0, 1])}
{('1/1', '2/1'): aapl xom
0 1 4
1 2 5
2 3 6}
答案 2 :(得分:1)
我的建议是收集每个密钥组合的数据框列表,然后为每个密钥连接一次。
当我迭代字典时,我会不连接,因为这将是昂贵且不必要的。换句话说,对于一个元组密钥连接20次比连接20个数据帧的列表更昂贵。
import pandas as pd
from collections import defaultdict
dct = { ('1/1', '2/1', 'AAPL') : pd.DataFrame({'aapl' : [1,2,3]}),
('1/1', '2/1', 'XOM') : pd.DataFrame({'xom' : [4,5,6]}) }
d = defaultdict(list)
for k, v in dct.items():
d[(k[0], k[1])].append(v)
res = {k: pd.concat(v, axis=1) for k, v in d.items()}
# {('1/1', '2/1'): aapl xom
# 0 1 4
# 1 2 5
# 2 3 6}
答案 3 :(得分:0)
循环dict的项目,然后如果key [:2]相同则连接数据帧。
代码如下:
import pandas as pd
df1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['letter', 'number'])
df2 = pd.DataFrame([['a', 3], ['b', 4]], columns=['letter', 'number'])
df3 = pd.DataFrame([['a', 6], ['b', 7]], columns=['letter', 'number'])
dct = { ('1/1' , '2/1', 'AAPL') : df1,
('1/1', '2/1' , 'XOM') : df2,
('1/2', '2/1' , 'XOM') : df3,}
result = {}
for key, value in dct.items():
if key[:2] in result:
result[key[:2]] = pd.concat([result[key[:2]], value])
else:
result[key[:2]] = value
for key, value in result.items():
print (key)
print (value)
print ('------------')
<强>输出:强>
('1/1', '2/1')
letter number
0 a 1
1 b 2
0 a 3
1 b 4
------------
('1/2', '2/1')
letter number
0 a 6
1 b 7
------------
[Finished in 0.977s]