【问题标题】:How to maintain Pandas DataFrame index order when using stack/unstack?使用 stack/unstack 时如何维护 Pandas DataFrame 索引顺序?
【发布时间】:2016-02-09 20:11:24
【问题描述】:

示例一: 注意给定 Pandas DataFrame df 的索引顺序:

>>> df
              A  B
first second      
zzz   z       2  4
      a       1  5
aaa   z       6  3
      a       7  8

在给定的df DataFrame 对象上使用stackunstack 方法后,索引会自动按字典顺序(按字母顺序)排序,从而丢失行的原始顺序。

>>> df.unstack().stack()
              A  B
first second      
aaa   a       7  8
      z       6  3
zzz   a       1  5
      z       2  4

上面的unstack/stack操作后是否可以保持原来的顺序?

根据官方文档reshaping-by-stacking-and-unstacking

请注意,stack 和 unstack 方法隐式地对涉及的索引级别进行排序。因此,调用 stack 然后 unstack,反之亦然,将导致原始 DataFrame 或 Series 的排序副本

示例二:

>>> dfu = df.unstack()
>>> dfu
         A      Z   
second   a  z   a  z
first               
aaa      7  6   8  3
zzz      1  2   5  4

如果保留原始索引,我们需要dfu,如下所示:

>>> dfu
             A      Z   
    second   a  z   a  z
    first               
    zzz      1  2   5  4
    aaa      7  6   8  3

我正在寻找的是一种解决方案,可用于在调用 unstack()stack() 方法后根据原始数据帧恢复索引顺序。

【问题讨论】:

  • 您可以保留原始索引的副本并重新索引...否则我不这么认为。
  • 例如,像上面一样,原始 DataFrame 的索引标签与生成的 DataFrame 的标签匹配,这可以工作。我正在寻找可能不是这种情况的解决方案。

标签: python pandas


【解决方案1】:

您可以保留一份原始 indexreindex 的副本,谢谢 Andy Hayden。

演示:

#              A  B
#first second      
#zzz   z       2  4
#      a       1  5
#aaa   z       6  3
#      a       7  8

print df.index
#MultiIndex(levels=[[u'aaa', u'zzz'], [u'a', u'z']],
#           labels=[[1, 1, 0, 0], [1, 0, 1, 0]],
#           names=[u'first', u'second'])

#set index to variable
index = df.index

#stack and unstack
df = df.unstack().stack()
print df
#              A  B
#first second      
#aaa   a       7  8
#      z       6  3
#zzz   a       1  5
#      z       2  4
#              A  B

df = df.reindex(index)
print df
#              A  B
#first second      
#zzz   z       2  4
#      a       1  5
#aaa   z       6  3
#      a       7  8

【讨论】:

  • 酷,这适用于df.unstack().stack() 的情况,但假设您只有df.unstack(),您需要运行df.unstack().reindex(df.index.get_level_values(0)) 才能使重新索引工作。
  • @AtlasStrategic 这似乎是我需要的,但它给了我 'TypeError: Expected tuple, got str' 来调用reindex
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多