将multiindex系列变成dict系列

时间:2018-02-19 08:00:07

标签: python pandas pandas-groupby multi-index

我有一个看起来像这样的Multiindex系列:

a 1 value_1
  2 value_2
  3 value_3
b 2 value_4
  4 value_5
  5 value_6
c 1 value_7
  5 value_8
  9 value_9

我想将它转换为单个索引系列,其中第二级索引现在是字典键,如下所示:

a {1: value_1, 2: value_2, 3: value_3}
b {2: value_4, 4: value_5, 5: value_6}
c {1: value_7, 5: value_8, 9: value_9}

我尝试过转换为数据帧然后执行to_dict(),但是多索引作为元组返回。我想要做的就是能够将第一级索引与第二级索引分离 - 所以任何帮助也是如此。

2 个答案:

答案 0 :(得分:3)

如果输入为Series

s = pd.Series({('c', 9): 'value_9', ('c', 1): 'value_7', ('b', 2): 'value_4', 
               ('a', 1): 'value_1', ('c', 5): 'value_8', ('a', 2): 'value_2', 
               ('b', 4): 'value_5', ('a', 3): 'value_3', ('b', 5): 'value_6'})
print (s)
a  1    value_1
   2    value_2
   3    value_3
b  2    value_4
   4    value_5
   5    value_6
c  1    value_7
   5    value_8
   9    value_9
dtype: object

s1 = (s.to_frame('D')
      .groupby(level=0)
      .apply(lambda x: dict(zip(x.index.get_level_values(1), x.D))))

print (s1)
a    {1: 'value_1', 2: 'value_2', 3: 'value_3'}
b    {2: 'value_4', 4: 'value_5', 5: 'value_6'}
c    {1: 'value_7', 5: 'value_8', 9: 'value_9'}
dtype: object

s = s.reset_index(level=1).groupby(level=0).apply(lambda x: dict(zip(x['level_1'], x[0])))
print (s)
a    {1: 'value_1', 2: 'value_2', 3: 'value_3'}
b    {2: 'value_4', 4: 'value_5', 5: 'value_6'}
c    {1: 'value_7', 5: 'value_8', 9: 'value_9'}
dtype: object

groupby与自定义lambda功能一起使用zipdict

print (df)
           C
A B         
a 1  value_1
  2  value_2
  3  value_3
b 2  value_4
  4  value_5
  5  value_6
c 1  value_7
  5  value_8
  9  value_9

d = df.reset_index(level=1).groupby(level=0).apply(lambda x: dict(zip(x.B, x.C))).to_dict()

或者:

d = df.groupby(level=0).apply(lambda x: dict(zip(x.index.get_level_values(1),x.C))).to_dict()
print (d)
{'a': {1: 'value_1', 2: 'value_2', 3: 'value_3'}, 
 'c': {1: 'value_7', 5: 'value_8', 9: 'value_9'},
 'b': {2: 'value_4', 4: 'value_5', 5: 'value_6'}}

输出Series省略最后to_dict

答案 1 :(得分:3)

系列

pd.Series({k: v[k].to_dict() for k, v in s.groupby(level=0)})

a    {1: 'value_1', 2: 'value_2', 3: 'value_3'}
b    {2: 'value_4', 4: 'value_5', 5: 'value_6'}
c    {1: 'value_7', 5: 'value_8', 9: 'value_9'}
dtype: object

词典

{k: v[k].to_dict() for k, v in s.groupby(level=0)}

{'a': {1: 'value_1', 2: 'value_2', 3: 'value_3'},
 'b': {2: 'value_4', 4: 'value_5', 5: 'value_6'},
 'c': {1: 'value_7', 5: 'value_8', 9: 'value_9'}}