【问题标题】:combine two pandas dataframe into one dataframe "dict type cell" (pd.Panel deprecated)将两个 pandas 数据帧组合成一个数据帧“dict type cell”(pd.Panel 已弃用)
【发布时间】:2018-03-17 10:31:50
【问题描述】:

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

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

【问题讨论】:

    标签: json mongodb pandas dataframe panel


    【解决方案1】:

    这是一个完全不同的概念,我很喜欢。


    您可以创建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''}
    

    【讨论】:

      【解决方案2】:

      解决方案
      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,我在上面的解决方案中展示了它。

      【讨论】:

      • 在第一个选项中,第二个操作(groupby)丢失了正确的索引,有没有办法修复它?
      • 从那时起我一直在编辑。我相信我现在拥有的东西是优越的。
      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      相关资源
      最近更新 更多