熊猫切片多索引数据框

Posted

技术标签:

【中文标题】熊猫切片多索引数据框【英文标题】:pandas slicing multiindex dataframe 【发布时间】:2017-02-22 19:08:05 【问题描述】:

我想切片一个多索引 pandas 数据帧

这是获取我的测试数据的代码:

import pandas as pd

testdf = 
    'Name': 
        0: 'H', 1: 'H', 2: 'H', 3: 'H', 4: 'H', 'Division': 
            0: 'C', 1: 'C', 2: 'C', 3: 'C', 4: 'C', 'EmployeeId': 
                0: 14, 1: 14, 2: 14, 3: 14, 4: 14, 'Amt1': 
                    0: 124.39, 1: 186.78, 2: 127.94, 3: 258.35000000000002, 4: 284.77999999999997, 'Amt2': 
                        0: 30.0, 1: 30.0, 2: 30.0, 3: 30.0, 4: 60.0, 'Employer': 
                            0: 'Z', 1: 'Z', 2: 'Z', 3: 'Z', 4: 'Z', 'PersonId': 
                                0: 14, 1: 14, 2: 14, 3: 14, 4: 15, 'Provider': 
                                    0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'B', 'Year': 
                                        0: 2012, 1: 2012, 2: 2013, 3: 2013, 4: 2012
testdf = pd.DataFrame(testdf)
testdf
grouper_keys = [
    'Employer',
    'Year',
    'Division',
    'Name',
    'EmployeeId',
    'PersonId']

testdf2 = pd.pivot_table(data=testdf,
                              values='Amt1',
                              index=grouper_keys,
                              columns='Provider',
                              fill_value=None,
                              margins=False,
                              dropna=True,
                              aggfunc=('sum', 'count'),
                              )

print(testdf2)

给予:

现在我只能使用 AB 获得 sum

testdf2.loc[:, slice(None, ('sum', 'A'))]

这给了

我怎样才能获得both sum count 仅限AB

【问题讨论】:

【参考方案1】:

你可以使用:

idx = pd.IndexSlice
df = testdf2.loc[:, idx[['sum', 'count'], 'A']]
print (df)
                                                    sum count
Provider                                              A     A
Employer Year Division Name EmployeeId PersonId              
Z        2012 C        H    14         14        311.17   2.0
                                       15           NaN   NaN
         2013 C        H    14         14        386.29   2.0

另一种解决方案:

df = testdf2.loc[:, (slice('sum','count'), ['A'])]
print (df)
                                                    sum count
Provider                                              A     A
Employer Year Division Name EmployeeId PersonId              
Z        2012 C        H    14         14        311.17   2.0
                                       15           NaN   NaN
         2013 C        H    14         14        386.29   2.0

【讨论】:

我认为 OP 想要 sumcount,而不是 AB 好吧,足够接近 ;) ..testdf2.loc[:, idx[['sum','count'], ['A']]] 看起来需要等待 10 分钟才能接受答案【参考方案2】:

使用xs 表示横截面

testdf2.xs('A', axis=1, level=1)

或者使用drop_level=False保持列水平

testdf2.xs('A', axis=1, level=1, drop_level=False)

【讨论】:

以上是关于熊猫切片多索引数据框的主要内容,如果未能解决你的问题,请参考以下文章

熊猫如何切片多索引数据框?

对唯一顺序索引的多索引熊猫数据框进行切片和赋值

将熊猫多索引切片彼此分开

熊猫:切片多索引与许多索引

将值从一个数据帧切片复制到另一个:使用“IndexSlice”的多索引熊猫数据帧的切片是不是总是一致地排序?

基于多索引列数据框中的列范围进行切片