首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas中添加层次索引和分级列名(有索引和没有索引)

在Pandas中添加层次索引和分级列名(有索引和没有索引)
EN

Stack Overflow用户
提问于 2018-08-06 01:45:43
回答 2查看 409关注 0票数 0

我是PythonPandas的初学者,自从我打开韦斯·麦金尼的书以来已经有两天了。所以,这个问题可能是一个基本的问题。

我使用的是Anaconda发行版(Python 3.6.6)和Pandas 0.21.0。在发布这篇文章之前,我研究了以下线程(https://pandas.pydata.org/pandas-docs/stable/advanced.htmlhttps://pandas.pydata.org/pandas-docs/stable/advanced.html#advanced-xsSelect only one index of multiindex DataFrameSelecting rows from pandas by subset of multiindexhttps://pandas.pydata.org/pandas-docs/stable/indexing.htmlxs函数)。它们都解释了如何使用分层索引或分层列(而不是两者兼用)对data.frame进行子集。

这是数据。

代码语言:javascript
复制
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 = akey2 = 1state = Title1 (列)和color = A (列)。经过几次尝试和错误之后,我发现这个版本是有效的(--我真的不知道为什么这样做--我的假设是data.loc['a',1]给出了一个索引dataframe,然后是subset...and等等):

代码语言:javascript
复制
data.loc['a',1].loc['Title1'].loc['A']

是否有更好的方法来进行上述子集?

问题:2删除索引后如何子集数据?

代码语言:javascript
复制
data_wo_index = data.reset_index()

我对R.中的data.table比较满意,因此,我考虑使用datatable.html来使用datatable.html知识对数据进行子集。

我一次尝试一步,但即使是第一步(即删除key1 = a )也给了我一个错误:

代码语言:javascript
复制
data_wo_index[data_wo_index['key1']=='a']

例外:不能处理一个非唯一的多索引!

我不知道为什么潘达斯仍然认为有多个索引。我已经把它重置了。

问题:3如果运行data.columns命令,将得到以下输出:

代码语言:javascript
复制
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时所看到的。

代码语言:javascript
复制
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类的对象,那么为什么我们需要留出几个列(例如上面的示例中的key1key2 )作为索引,这意味着为什么我们不能仅仅使用基于列的索引?(相比之下,在R中的data.table中,我们可以设置任意列的键。)

问题4为什么列名是MultiIndex类的对象?如果有人能对此提供理论上的解决办法,那就太好了。

作为初学者,我非常感谢你的想法。我花了3-4个小时研究这个话题,结果陷入了死胡同.

EN

回答 2

Stack Overflow用户

发布于 2018-08-06 02:01:55

首先,使用MultiIndex可能很棘手,因此值得考虑的是,它们是否确实为您实际所做的工作提供了足够的好处(就速度/组织而言),从而使这些麻烦变得值得。

要回答您的问题1,您可以通过为每个轴提供所需键的元组来子集MultiIndexed数据。因此,第一个示例子集可以执行如下操作:

代码语言:javascript
复制
# 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')]

这意味着:

代码语言:javascript
复制
state   color
Title1  A        0
        A        1
Name: (a, 1), dtype: int32
票数 1
EN

Stack Overflow用户

发布于 2018-08-06 02:04:59

哇似乎有很多问题..。

Q1多重索引我将推荐IndexSlice

代码语言:javascript
复制
data.loc[pd.IndexSlice['a',1],pd.IndexSlice['Title1','A']]
Out[410]: 
state   color
Title1  A        0
        A        1

Q2当您为这个完整的数据框架重置索引时,它会有一些问题,我认为在R中,没有ftable就无法做到这一点。

这是处理熊猫的方法

代码语言:javascript
复制
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  11

Q3我认为columnindex多级提供了4维,是的,您可以使用一个列或索引来表示所有的只做stack

代码语言:javascript
复制
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      35

Q4 MultiIndex是索引类型之一,pandasindexcolumns处理为索引类型。

例如

代码语言:javascript
复制
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')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51699630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档