熊猫切片多索引数据框
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)
给予:
现在我只能使用 A
或 B
获得 sum
testdf2.loc[:, slice(None, ('sum', 'A'))]
这给了
我怎样才能获得both sum
和 count
仅限A
或B
【问题讨论】:
【参考方案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 想要sum
和 count
,而不是 A
和 B
。
好吧,足够接近 ;) ..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)
【讨论】:
以上是关于熊猫切片多索引数据框的主要内容,如果未能解决你的问题,请参考以下文章