【问题标题】:Turn multiindex Series into Series of dict将多索引系列变成字典系列
【发布时间】:2018-07-29 10:11:03
【问题描述】:

我有一个看起来像这样的多索引系列:

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(),但多索引作为元组返回。我想要做的就是能够将第一级索引与第二级索引解耦 - 因此,我们也感谢您提供的任何帮助。

【问题讨论】:

    标签: python pandas pandas-groupby multi-index


    【解决方案1】:

    如果输入是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

    【讨论】:

      【解决方案2】:

      系列

      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'}}
      

      【讨论】:

      • 工作得非常好!不需要 zip() 的列表理解方法。谢谢!
      猜你喜欢
      • 2017-03-08
      • 2017-12-05
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2014-07-11
      • 2018-10-12
      • 2017-03-13
      相关资源
      最近更新 更多