Aay*_*hah 4 python data-analysis dataframe python-3.x pandas
请出于好奇而轻率地提出这个问题:
\n当我试图了解 MultiIndex 中的切片如何工作时,我遇到了以下情况 \xe2\x86\x93
\n# Simple MultiIndex Creation\nindex = pd.MultiIndex.from_product([[\'a\', \'c\', \'b\'], [1, 2]])\n\n# Making Series with that MultiIndex\ndata = pd.Series(np.random.randint(10, size=6), index=index)\nRun Code Online (Sandbox Code Playgroud)\n返回:
\n\na 1 5\n 2 0\nc 1 8\n 2 6\nb 1 6\n 2 3\nd类型: int32\n\n
请注意,索引不按排序顺序,即。是在切片时会导致我们想要的预期a, c, b错误的顺序。
# When we do slicing\ndata.loc["a":"c"]\nRun Code Online (Sandbox Code Playgroud)\n错误如:
\n\nUnsortedIndexError\n\n----> 1 data.loc["a":"c"]\nUnsortedIndexError: \'密钥长度 (1) 大于 MultiIndex lexsort 深度 (0)\'\n\n
这是预料之中的。但现在,执行以下步骤后:
\n# Making a DataFrame\ndata = data.unstack()\n\n# Redindexing - to unsort the indices like before\ndata = data.reindex(["a", "c", "b"])\n\n# Which looks like \n 1 2\na 5 0\nc 8 6\nb 6 3\n\n# Then again making series\ndata = data.stack()\n\n# Reindex Again!\ndata = data.reindex(["a", "c", "b"], level=0)\n\n\n# Which looks like before\na 1 5\n 2 0\nc 1 8\n 2 6\nb 1 6\n 2 3\ndtype: int32\nRun Code Online (Sandbox Code Playgroud)\n所以,现在的流程是:Series \xe2\x86\x92 Unstack \xe2\x86\x92 DataFrame \xe2\x86\x92 Stack \xe2\x86\x92 Series
现在,如果我像以前一样进行切片(索引未排序仍然进行),我们不会收到任何错误!
\n# The same slicing\ndata.loc["a":"c"]\nRun Code Online (Sandbox Code Playgroud)\n没有错误的结果:
\n\na 1 5\n 2 0\nc 1 8\n 2 6\nd类型: int32\n\n
即使\ data.index.is_monotonicxe2\x86\x92 False。那么为什么我们可以切片呢?
所以问题是:为什么?。
\n\n我希望你能理解这里的情况。因为看到,在给出错误之前的同一系列,在
\nunstackandstack操作之后没有给出任何错误。
那么这是一个错误,还是我在这里缺少的一个新概念?
\n谢谢!
\nAayush \xe2\x88\x9e 沙阿
更新:\n我已经使用data.reindex()so 再次取消排序。请再看一下。
您的 2 个数据框之间的差异如下:
index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]])
data = pd.Series(np.random.randint(10, size=6), index=index)
data2 = data.unstack().reindex(["a", "c", "b"]).stack()
>>> data.index.codes
FrozenList([[0, 0, 2, 2, 1, 1], [0, 1, 0, 1, 0, 1]])
>>> data2.index.codes
FrozenList([[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
Run Code Online (Sandbox Code Playgroud)
即使您的两个索引外观(值)相同,内部索引(代码)也是不同的。
检查此方法MultiIndex:
Create a new MultiIndex from the current to monotonically sorted
items IN the levels. This does not actually make the entire MultiIndex
monotonic, JUST the levels.
The resulting MultiIndex will have the same outward
appearance, meaning the same .values and ordering. It will also
be .equals() to the original.
Run Code Online (Sandbox Code Playgroud)
旧答案
# Making a DataFrame
data = data.unstack()
# Which looks like # <- WRONG
1 2 # 1 2
a 5 0 # a 8 0
c 8 6 # b 4 1
b 6 3 # c 7 6
# Then again making series
data = data.stack()
# Which looks like before # <- WRONG
a 1 5 # a 1 2
2 0 # 2 1
c 1 8 # b 1 0
2 6 # 2 1
b 1 6 # c 1 3
2 3 # 2 9
dtype: int32
Run Code Online (Sandbox Code Playgroud)
如果你想使用切片,你必须检查索引是否单调:
# Simple MultiIndex Creation
index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]])
# Making Series with that MultiIndex
data = pd.Series(np.random.randint(10, size=6), index=index)
>>> data.index.is_monotonic
False
>>> data.unstack().stack().index.is_monotonic
True
>>> data.sort_index().index.is_monotonic
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |