从pandas dataframe创建嵌套字典

时间:2018-06-08 10:42:25

标签: python pandas dictionary

我正在尝试从pandas数据帧创建嵌套字典。

我有这个数据框:

# this code should reproduce the example dataframe below:
df = pd.DataFrame({'ScID.xml': {0: '0006-****(****)050[****:ayfb]2.3.co.xml',
  1: '0006-****(****)050[****:smihds]2.3.co.xml',
  2: '0006-****(****)050[****:gissad]2.3.co.xml'},
 'topic1': {0: 7.26744186046513e-06, 1: 0.0006479109, 2: 3.413e-06},
 'topic2': {0: 7.26744186046513e-06, 1: 0.0091339857, 2: 3.413e-06},
 'topic3': {0: 7.26744186046513e-06, 1: 2.79485746226941e-06, 2: 3.413e-06}})

# example dataframe:
                                    ScID.xml    topic1    topic2    topic3
0    0006-****(****)050[****:ayfb]2.3.co.xml  0.000007  0.000007  0.000007
1  0006-****(****)050[****:smihds]2.3.co.xml  0.000648  0.009134  0.000003
2  0006-****(****)050[****:gissad]2.3.co.xml  0.000003  0.000003  0.000003

我想生成一个这样的嵌套字典:

new_dict = {
   'topic1': {'0006-****(****)050[****:ayfb]2.3.co.xml': 0.000007,
   '0006-****(****)050[****:smihds]2.3.co.xml': 0.000648,
   '0006-****(****)050[****:gissad]2.3.co.xml': 0.000003},

   'topic2': {'0006-****(****)050[****:ayfb]2.3.co.xml': 0.000007,
   '0006-****(****)050[****:smihds]2.3.co.xml': 0.009134,
   '0006-****(****)050[****:gissad]2.3.co.xml': 0.000003},

   'topic3': {'0006-****(****)050[****:ayfb]2.3.co.xml': 0.000007,
   '0006-****(****)050[****:smihds]2.3.co.xml': 0.000003,
   '0006-****(****)050[****:gissad]2.3.co.xml': 0.000003}
}

其中topicX是键,ScID.xmls是子键。

2 个答案:

答案 0 :(得分:4)

您可以使用set_index,然后使用pd.DataFrame.to_dict

res = df.set_index('ScID.xml').to_dict(orient='dict')

{'topic1': {'0006-****(****)050[****:ayfb]2.3.co.xml': 7.2674418604651302e-06,
  '0006-****(****)050[****:gissad]2.3.co.xml': 3.4130000000000002e-06,
  '0006-****(****)050[****:smihds]2.3.co.xml': 0.0006479109},
 'topic2': {'0006-****(****)050[****:ayfb]2.3.co.xml': 7.2674418604651302e-06,
  '0006-****(****)050[****:gissad]2.3.co.xml': 3.4130000000000002e-06,
  '0006-****(****)050[****:smihds]2.3.co.xml': 0.0091339856999999997},
 'topic3': {'0006-****(****)050[****:ayfb]2.3.co.xml': 7.2674418604651302e-06,
  '0006-****(****)050[****:gissad]2.3.co.xml': 3.4130000000000002e-06,
  '0006-****(****)050[****:smihds]2.3.co.xml': 2.79485746226941e-06}}

答案 1 :(得分:3)

DataFrame.set_index使用DataFrame.to_dict,默认情况下参数orient='dict',省略:

d = df.set_index('ScID.xml').to_dict()

print (d)

{'topic1': {'0006-****(****)050[****:ayfb]2.3.co.xml': 7.26744186046513e-06, 
            '0006-****(****)050[****:smihds]2.3.co.xml': 0.0006479109, 
            '0006-****(****)050[****:gissad]2.3.co.xml': 3.413e-06}, 
'topic2': {'0006-****(****)050[****:ayfb]2.3.co.xml': 7.26744186046513e-06, 
           '0006-****(****)050[****:smihds]2.3.co.xml': 0.0091339857, 
          '0006-****(****)050[****:gissad]2.3.co.xml': 3.413e-06}, 
'topic3': {'0006-****(****)050[****:ayfb]2.3.co.xml': 7.26744186046513e-06, 
           '0006-****(****)050[****:smihds]2.3.co.xml': 2.79485746226941e-06, 
           '0006-****(****)050[****:gissad]2.3.co.xml': 3.413e-06}}