【问题标题】:convert a df into a specific dictionary of dictionary in pandas将 df 转换为 pandas 中特定字典的字典
【发布时间】:2020-08-19 14:26:33
【问题描述】:

我有一个如下所示的df

Params                       Value
teachers                        49
students                       289
R                              3.7
holidays                       165
OS                              18
Em_from   2020-02-29T20:00:00.000Z
Em_to     2020-03-20T20:00:00.000Z
Em_F                             3
Em_C                             2
sC_from   2020-03-31T20:00:00.000Z
sC_to     2020-05-29T20:00:00.000Z
sC_F                            25
sC_C                            31

从上面的df我想将其转换为字典的字典,如下所示。

字典:

{'teachers': 49, 
 'students': 289,  
 'R': 3.7, 
 'holidays': 165,
 'OS':18,
 'Em': {'from': '2020-02-29T20:00:00.000Z', 'to': '2020-03-20T20:00:00.000Z', 
       'F': 3, 'C': 2},
 'sC': {'from': '2020-03-31T20:00:00.000Z', 'to': '2020-05-29T20:00:00.000Z', 
        'F': 25, 'C': 31}}

【问题讨论】:

    标签: python-3.x pandas dataframe dictionary


    【解决方案1】:

    用途:

    s = df['Params'].str.split('_')
    m = s.str.len().eq(1)
    
    d1 = df[m].set_index('Params')['Value'].to_dict()
    d2 = df[~m].assign(Params=s.str[-1]).agg(tuple, axis=1)\
               .groupby(s.str[0]).agg(lambda s: dict(s.tolist())).to_dict()
    
    dct = {**d1, **d2}
    

    结果:

    {'Em': {'C': '2',
            'F': '3',
            'from': '2020-02-29T20:00:00.000Z',
            'to': '2020-03-20T20:00:00.000Z'},
     'OS': '18',
     'R': '3.7',
     'holidays': '165',
     'sC': {'C': '31',
            'F': '25',
            'from': '2020-03-31T20:00:00.000Z',
            'to': '2020-05-29T20:00:00.000Z'},
     'students': '289',
     'teachers': '49'}
    

    【讨论】:

      【解决方案2】:

      请始终尝试以可重复的方式提供数据,更多人将能够尝试该问题

      数据集

      Params = ['teachers','students','R','holidays','OS','Em_from','Em_to','Em_F','Em_C','sC_from','sC_to','sC_F','sC_C']                       
      
      Value = ['49','289','3.7','165','18','2020-02-29T20:00:00.000Z','2020-03-20T20:00:00.000Z','3','2','2020-03-31T20:00:00.000Z','2020-05-29T20:00:00.000Z','25','31']
      
      df = pd.DataFrame(zip(Params,Value),columns=["col1","col2"])
      

      你可以做类似的事情

      d = {}
      for lst in df.values:
          for k,v in zip(lst[0:],lst[1:]):
              if any(name in k for name in ('Em_from', 'sC_from')):d[k.split('_')[0]] = {k.split('_')[1]:v}
              elif any(name in k for name in ('Em_to', 'Em_F','Em_C','sC_to','sC_F','sC_C')):d[k.split('_')[0]][k.split('_')[1]] = v
              else:d[k] = v
      

      输出

      {'teachers': '49',
       'students': '289',
       'R': '3.7',
       'holidays': '165',
       'OS': '18',
       'Em': {'from': '2020-02-29T20:00:00.000Z',
        'to': '2020-03-20T20:00:00.000Z',
        'F': '3',
        'C': '2'},
       'sC': {'from': '2020-03-31T20:00:00.000Z',
        'to': '2020-05-29T20:00:00.000Z',
        'F': '25',
        'C': '31'}}
      

      【讨论】:

        【解决方案3】:

        panda 的数据框有一个 to_json 方法 (see docs)

        那里有多个示例,但一般流程是这样的,假设您有一个名为 df 的数据框:

        import json
        import pandas as pd
        
        parsed = df.to_json()
        df_json = json.loads(json_df)
        

        阅读文档以查看更多示例和您可能需要处理的不同参数。

        【讨论】:

          猜你喜欢
          • 2022-01-19
          • 2019-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-26
          • 2014-12-30
          相关资源
          最近更新 更多