Concat python值基于python dict中的类似键

时间:2018-04-03 17:32:26

标签: python python-3.x pandas dataframe

我有以下字典:

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] })

4 个答案:

答案 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]