我正在尝试使用多级索引对数据帧进行子集化。例如:
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
'office_id': range(1, 7) * 2,
'sales': [np.random.randint(100000, 999999)
for _ in range(12)]})
df2=df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
sales
state office_id
AZ 2 839507
4 373917
6 347225
CA 1 798585
3 890850
5 454423
CO 1 819975
3 202969
5 614011
WA 2 163942
4 369858
6 959285
如您所见,df2包含带有state和office_id的多级索引。对于df2,我想使用multindex对数据帧进行子集化,找到以下内容:
1)只有州= AZ
2)只有office_id< 4
3)state = CA和office_id = 5
从历史上看,我会将索引放在数据框中,并按列进行子集化,但这样做效率不高。
有人可以指出我正确的方向吗?谢谢!
答案 0 :(得分:3)
使用索引.get_level_values
的索引,即示例
df2.loc[(df2.index.get_level_values(0)=='AZ')]
# Also you can specify the name i.e df2.loc[(df2.index.get_level_values('state')=='AZ')]
sales
state office_id
AZ 2 469728
4 398925
6 704669
df2.loc[(df2.index.get_level_values(0)=='CA') & (df2.index.get_level_values(1)<4)]
sales
state office_id
CA 1 105244
3 116514
答案 1 :(得分:1)
您还可以使用query方法:
由于随机数,我的df2有点不同:
df2
sales
state office_id
AZ 2 399569
4 784863
6 161690
CA 1 324148
3 631289
5 917734
CO 1 380714
3 289783
5 682802
WA 2 941091
4 804442
6 379563
只有亚利桑那州办事处:
df2.query('state == "AZ"')
sales
state office_id
AZ 2 399569
4 784863
6 161690
只有办公室ID少于4:
df2.query('office_id < 4')
sales
state office_id
AZ 2 399569
CA 1 324148
3 631289
CO 1 380714
3 289783
WA 2 941091
加州和办公室id = 5
df2.query('state == "CA" & office_id == 5')
sales
state office_id
CA 5 917734