多列的 pandas get_level_values

新手上路,请多包涵

有没有办法获得 get_level_values 多列的结果?

给定以下 DataFrame

          d
a b c
1 4 10  16
    11  17
  5 12  18
2 5 13  19
  6 14  20
3 7 15  21

我希望获得级别 ac 的值( 元组列表):

 [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)]

笔记:

  • 不可能给 get_level_values 超过一级( 例如 df.index.get_level_values(['a','c']

  • 有一种解决方法,可以在每个所需的列上使用 get_level_valueszip 它们一起使用:

例如:

 a_list = df.index.get_level_values('a').values
c_list = df.index.get_level_values('c').values

print([i for i in zip(a_list,c_list)])
[(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)]

但随着列数的增加,它会变得很麻烦。

  • 构建示例的代码 DataFrame

df = pd.DataFrame({'a':[1,1,1,2,2,3],'b':[4,4,5,5,6,7,],'c':[10,11,12,13,14,15], 'd':[16,17,18,19,20,21]}).set_index(['a','b','c'])

原文由 danielhadar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 852
2 个回答

--- 的 .tolist() 方法给出了 MultiIndex MultiIndex 所有级别的元组列表。例如,对于您的示例 DataFrame

 df.index.tolist()
# => [(1, 4, 10), (1, 4, 11), (1, 5, 12), (2, 5, 13), (2, 6, 14), (3, 7, 15)]

所以这里有两个想法:

  1. 从原始 MultiIndex 中获取元组列表并过滤结果。
    [(a, c) for a, b, c in df.index.tolist()]
   # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)]

这种简单方法的缺点是您必须手动指定所需级别的顺序。您可以利用 itertools.compress 按名称选择它们。

    from itertools import compress

   mask = [1 if name in ['a', 'c'] else 0 for name in df.index.names]
   [tuple(compress(t, mask)) for t in df.index.tolist()]
   # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)]

  1. 创建一个完全具有您想要的级别的 MultiIndex 并在其上调用 .tolist()
    df.index.droplevel('b').tolist()
   # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)]

如果你更愿意命名你想要保留的级别——而不是那些你想要删除的级别——你可以做类似的事情

   df.index.droplevel([level for level in df.index.names
                   if not level in ['a', 'c']]).tolist()
   # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)]

原文由 Alicia Garcia-Raboso 发布,翻译遵循 CC BY-SA 3.0 许可协议

只要您可以传递要选择的索引名称列表,这就不那么麻烦了:

 df.reset_index()[['a', 'c']].to_dict(orient='split')['data']

我还没有找到直接从索引对象中选择级别 'a''b' 的方法,因此使用 reset_index

请注意 to_dict 返回列表列表而不是元组:

 [[1, 10], [1, 11], [1, 12], [2, 13], [2, 14], [3, 15]]

原文由 IanS 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题