使用堆栈/堆栈时如何维护Pandas DataFrame索引顺序?

Atl*_*gic 6 python pandas

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

>>> df
              A  B
first second      
zzz   z       2  4
      a       1  5
aaa   z       6  3
      a       7  8
Run Code Online (Sandbox Code Playgroud)

在给定DataFrame对象上使用stackunstack方法之后df,索引将按字典顺序(按字母顺序)自动排序,以使该索引失去行的原始顺序。

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

完成上述unstack/stack操作后是否可以保持原始订购?

根据官方文档,通过堆叠和堆叠重塑

请注意,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
Run Code Online (Sandbox Code Playgroud)

如果保留了原始索引,我们需要dfu这样:

>>> dfu
             A      Z   
    second   a  z   a  z
    first               
    zzz      1  2   5  4
    aaa      7  6   8  3
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 7

您可以保留原件的副本index重新索引谢谢安迪·海登。

演示:

#              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
Run Code Online (Sandbox Code Playgroud)

  • 很酷,这适用于 `df.unstack().stack()` 的情况,但是假设你只有 `df.unstack()`,你需要运行 `df.unstack().reindex(df.index) .get_level_values(0))` 使重新索引工作。 (2认同)