将两个pandas数据帧合并为一个数据帧“dict type cell”(不推荐使用pd.Panel)

时间:2017-10-05 17:45:31

标签: json mongodb pandas dataframe panel

我正在尝试将多个pandas.DataFrame连接到一个集合中的mongodb中保存,所有数据帧都具有相同的索引/列,我想使用to_json()方法在一个文档中保存它。将数据帧的所有单元格作为dicts,它可能是一个很好的方法。为了实现这一点,我想连接这样的数据帧:

df1:                
 index   A      B
 1     'A1'   'B1'
 2     'A2'   'B2'
 3     'A3'   'B3'

df2:
 index  A      B
 1    'a1'   'b1'
 2    'a2'   'b2'
 3    'a3'   'b3'

预期解决方案:

df_sol:
 index    A                    B
 1        {d1:'A1', d2:'a1'}   {d1:'B1', d2:'b1'}
 2        {d1:'A2', d2:'a2'}   {d1:'B2', d2:'b2'}
 3        {d1:'A3', d2:'a3'}   {d1:'B3', d2:'b3'}

我正在使用的方法是

pd.Panel(dict(d1=df1, d2=df2)).apply(pd.Series.to_dict, 0)

                              A                         B
index                                                    
1      {'d1': 'A1', 'd2': 'a1'}  {'d1': 'B1', 'd2': 'b1'}
2      {'d1': 'A2', 'd2': 'a2'}  {'d1': 'B2', 'd2': 'b2'}
3      {'d1': 'A3', 'd2': 'a3'}  {'d1': 'B3', 'd2': 'b3'}

pd.Panel已将其弃用DeprecationWarning : Panel is deprecated and will be removed in a future version.仅使用pandas进行解决方法? 谢谢!

Original Question

2 个答案:

答案 0 :(得分:2)

这是一个完全不同的概念,我很开心。

您可以创建dict的子类,我们将其定义为字典合并。

from cytoolz.dicttoolz import merge

class mdict(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def __add__(self, other):
        return(mdict(merge(self, other)))


df1.applymap(lambda x: mdict(d1=x)) + df2.applymap(lambda x: mdict(d2=x))

                                  A                             B
index                                                            
1      {'d1': ''A1'', 'd2': ''a1''}  {'d1': ''B1'', 'd2': ''b1''}
2      {'d1': ''A2'', 'd2': ''a2''}  {'d1': ''B2'', 'd2': ''b2''}
3      {'d1': ''A3'', 'd2': ''a3''}  {'d1': ''B3'', 'd2': ''b3''}

答案 1 :(得分:1)

<强>解决方案
pd.concat +其他内容

pd.Series(
    pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack().to_dict('index')
).unstack()

                              A                             B
1  {'d1': ''A1'', 'd2': ''a1''}  {'d1': ''B1'', 'd2': ''b1''}
2  {'d1': ''A2'', 'd2': ''a2''}  {'d1': ''B2'', 'd2': ''b2''}
3  {'d1': ''A3'', 'd2': ''a3''}  {'d1': ''B3'', 'd2': ''b3''}

<强>解释
我希望将[1, 2, 3]['A', 'B']放入索引,将['d1', 'd2']作为列。

我从pd.concat

开始
pd.concat([df1, df2], axis=1, keys=['d1', 'd2'])

         d1          d2      
          A     B     A     B
index                        
1      'A1'  'B1'  'a1'  'b1'
2      'A2'  'B2'  'a2'  'b2'
3      'A3'  'B3'  'a3'  'b3'

几乎让我在那里。如果我使用stack跟随它,它会将列的最后一级放到索引的最后一级:

pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack()

           d1    d2
index              
1     A  'A1'  'a1'
      B  'B1'  'b1'
2     A  'A2'  'a2'
      B  'B2'  'b2'
3     A  'A3'  'a3'
      B  'B3'  'b3'

这就是我想要的。从这里我可以使用.to_dict('index')

pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack().to_dict('index')

{(1, 'A'): {'d1': "'A1'", 'd2': "'a1'"},
 (1, 'B'): {'d1': "'B1'", 'd2': "'b1'"},
 (2, 'A'): {'d1': "'A2'", 'd2': "'a2'"},
 (2, 'B'): {'d1': "'B2'", 'd2': "'b2'"},
 (3, 'A'): {'d1': "'A3'", 'd2': "'a3'"},
 (3, 'B'): {'d1': "'B3'", 'd2': "'b3'"}}

然后将其传递回pd.Series构造函数以获取一系列字典。

pd.Series(
    pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack().to_dict('index')
)

1  A    {'d1': ''A1'', 'd2': ''a1''}
   B    {'d1': ''B1'', 'd2': ''b1''}
2  A    {'d1': ''A2'', 'd2': ''a2''}
   B    {'d1': ''B2'', 'd2': ''b2''}
3  A    {'d1': ''A3'', 'd2': ''a3''}
   B    {'d1': ''B3'', 'd2': ''b3''}
dtype: object

我唯一要做的就是unstack,我在上面的解决方案中展示了这一点。