我是Python和Pandas的初学者,自从我打开韦斯·麦金尼的书以来已经有两天了。所以,这个问题可能是一个基本的问题。
我使用的是Anaconda发行版(Python 3.6.6)和Pandas 0.21.0。在发布这篇文章之前,我研究了以下线程(https://pandas.pydata.org/pandas-docs/stable/advanced.html、https://pandas.pydata.org/pandas-docs/stable/advanced.html#advanced-xs、Select only one index of multiindex DataFrame、Selecting rows from pandas by subset of multiindex和https://pandas.pydata.org/pandas-docs/stable/indexing.html的xs函数)。它们都解释了如何使用分层索引或分层列(而不是两者兼用)对data.frame进行子集。
这是数据。
import pandas as pd
import numpy as np
from numpy import nan as NA
#Hierarchical index for row and column
data = pd.DataFrame(np.arange(36).reshape(6,6),
index=[['a']*2+['b']*1+['c']*1+['d']*2,
[1, 2, 3, 1, 3, 1]],
columns = [['Title1']*3+['Title2']*3,
['A']*2+['B']*2+['C']*2])
data.index.names = ['key1','key2']
data.columns.names = ['state','color']以下是我的问题:
问题:1我想访问key1 = a、key2 = 1、state = Title1 (列)和color = A (列)。经过几次尝试和错误之后,我发现这个版本是有效的(--我真的不知道为什么这样做--我的假设是data.loc['a',1]给出了一个索引dataframe,然后是subset...and等等):
data.loc['a',1].loc['Title1'].loc['A']是否有更好的方法来进行上述子集?
问题:2删除索引后如何子集数据?
data_wo_index = data.reset_index()我对R.中的data.table比较满意,因此,我考虑使用datatable.html来使用datatable.html知识对数据进行子集。
我一次尝试一步,但即使是第一步(即删除key1 = a )也给了我一个错误:
data_wo_index[data_wo_index['key1']=='a']例外:不能处理一个非唯一的多索引!
我不知道为什么潘达斯仍然认为有多个索引。我已经把它重置了。
问题:3如果运行data.columns命令,将得到以下输出:
MultiIndex(levels=[['Title1', 'Title2'], ['A', 'B', 'C']],
labels=[[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 2, 2]],
names=['state', 'color'])在我看来,列名也是索引。我这么说是因为我看到了MultiIndex类,这就是我运行data.index时所看到的。
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],
labels=[[0, 0, 1, 2, 3, 3], [0, 1, 2, 0, 2, 0]],
names=['key1', 'key2'])我不知道为什么列名也出现在MultiIndex类的对象上。如果它们确实是MultiIndex类的对象,那么为什么我们需要留出几个列(例如上面的示例中的key1和key2 )作为索引,这意味着为什么我们不能仅仅使用基于列的索引?(相比之下,在R中的data.table中,我们可以设置任意列的键。)
问题4为什么列名是MultiIndex类的对象?如果有人能对此提供理论上的解决办法,那就太好了。
作为初学者,我非常感谢你的想法。我花了3-4个小时研究这个话题,结果陷入了死胡同.
发布于 2018-08-06 02:01:55
首先,使用MultiIndex可能很棘手,因此值得考虑的是,它们是否确实为您实际所做的工作提供了足够的好处(就速度/组织而言),从而使这些麻烦变得值得。
要回答您的问题1,您可以通过为每个轴提供所需键的元组来子集MultiIndexed数据。因此,第一个示例子集可以执行如下操作:
# We want to use ":" to get all the states, but can't just
# have ":" by itself due to Python's syntax rules
# So pandas provides the IndexSlice object to wrap it in
slicer = pd.IndexSlice
data.loc[('a', 1), (slicer[:], 'A')]这意味着:
state color
Title1 A 0
A 1
Name: (a, 1), dtype: int32发布于 2018-08-06 02:04:59
哇似乎有很多问题..。
Q1多重索引我将推荐IndexSlice
data.loc[pd.IndexSlice['a',1],pd.IndexSlice['Title1','A']]
Out[410]:
state color
Title1 A 0
A 1Q2当您为这个完整的数据框架重置索引时,它会有一些问题,我认为在R中,没有ftable就无法做到这一点。
这是处理熊猫的方法
data_wo_index.loc[np.concatenate(data_wo_index.loc[:,pd.IndexSlice['key1',:]].values=='a')]
Out[434]:
state key1 key2 Title1 Title2
color A A B B C C
0 a 1 0 1 2 3 4 5
1 a 2 6 7 8 9 10 11Q3我认为column和index多级提供了4维,是的,您可以使用一个列或索引来表示所有的只做stack
data.stack()
Out[436]:
state Title1 Title2
key1 key2 color
a 1 A 0 3
B 1 4
C 2 5
2 A 6 9
B 7 10
C 8 11
b 3 A 12 15
B 13 16
C 14 17
c 1 A 18 21
B 19 22
C 20 23
d 3 A 24 27
B 25 28
C 26 29
1 A 30 33
B 31 34
C 32 35Q4 MultiIndex是索引类型之一,pandas将index和columns处理为索引类型。
例如
df.index # index but just different type of index
Out[441]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')
df.columns # index as well
Out[442]: Index(['A', 'B'], dtype='object')https://stackoverflow.com/questions/51699630
复制相似问题