熊猫数据框到所需的Python字典

时间:2019-01-03 07:14:52

标签: python pandas dictionary

我有一个如下所示的数据框

 Date        Top      
            A    B
2018-09-30  1.2  2.3
2018-10-01  1.5  1.7
2018-10-02  2.3  2.8
2018-10-03  7.7  7.5
2018-10-04  1.1  0.9
2018-10-05  2.1  6.5

所以我在列中有多个索引,只有两个列“日期”和“顶部”,然后“顶部”有两个1级列“ A”和“ B”。

我正在尝试将它们转换为python字典。

当我使用

df_dict = df.to_dict(orient = 'index')

我得到一个输出

{0: {('Top', 'A'): 1.2, ('Top', 'B'): 2.3, ('date', ''): '2018-09-30'},
1: {('Top', 'A'): 1.5, ('Top', 'B'): 1.7, ('date', ''): '2018-10-01'},
2: {('Top', 'A'): 2.3, ('Top', 'B'): 2.8, ('date', ''): '2018-10-02'},
3: {('Top', 'A'): 7.7, ('Top', 'B'): 7.5, ('date', ''): '2018-10-03'},
4: {('Top', 'A'): 1.1, ('Top', 'B'): 0.9, ('date', ''): '2018-10-04'},
5: {('Top', 'A'): 2.1, ('Top', 'B'): 6.5, ('date', ''): '2018-10-05'}}

现在我可以使用以下脚本访问df_dict,该脚本的输出为1.2

df_dict[1]['Top']['Top','A']

但是我正在寻找此脚本的输出

df_dict[1]['Top']

Output: A:1.2, B:2.3

因为“ Top”不是第一个[1]键值对内的键。这样我就可以轻松访问所有“热门”日期。

感谢所有帮助

1 个答案:

答案 0 :(得分:3)

您可以使用dict comprehension进行第一级Top的过滤:

df_dict = df.to_dict(orient = 'index')
out = {k2: v for (k1, k2), v in df_dict[0].items() if k1 == 'Top'}
print (out)
{'A': 1.2, 'B': 2.3}

更简单的方法是使用熊猫根据索引值和第一级MultiIndex进行选择,然后创建dict

print (df.loc[0, 'Top'])
A    1.2
B    2.3
Name: 0, dtype: object

out = df.loc[0, 'Top'].to_dict()
print (out)
{'A': 1.2, 'B': 2.3}

编辑:

print (df)
              A    B
2018-09-30  1.2  2.3
2018-10-01  1.5  1.7
2018-10-02  2.3  2.8
2018-10-03  7.7  7.5
2018-10-04  1.1  0.9
2018-10-05  2.1  6.5

df.index.name = 'date'
df = df.reset_index()
#set MultiIndex for each columns for avoid empty strings keys
df.columns = [['d','Top', 'Top'], df.columns]

#for each first level of MultiIndex create dictionary
#also add new level to outer level of dict 
out = {x:df[x].to_dict(orient = 'index') for x in df.columns.levels[0]}
print (out)
{'Top': {0: {'A': 1.2, 'B': 2.3}, 1: {'A': 1.5, 'B': 1.7}, 2: {'A': 2.3, 'B': 2.8}, 
         3: {'A': 7.7, 'B': 7.5}, 4: {'A': 1.1, 'B': 0.9}, 5: {'A': 2.1, 'B': 6.5}}, 
'd': {0: {'date': '2018-09-30'}, 1: {'date': '2018-10-01'}, 
      2: {'date': '2018-10-02'}, 3: {'date': '2018-10-03'}, 
      4: {'date': '2018-10-04'}, 5: {'date': '2018-10-05'}}}

print (out['Top'][0])
{'A': 1.2, 'B': 2.3}