标签:python select dataframe pandas multi-index
我有一个像这样的多索引数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({'ind1': list('aaaaaaaaabbbbbbbbb'),
'ind2': list('cccdddeeecccdddeee'),
'ind3': list(range(3))*6,
'val1': list(range(100, 118)),
'val2': list(range(70, 88))})
df_mult = df.set_index(['ind1', 'ind2', 'ind3'])
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
e 0 106 76
1 107 77
2 108 78
b c 0 109 79
1 110 80
2 111 81
d 0 112 82
1 113 83
2 114 84
e 0 115 85
1 116 86
2 117 87
我现在可以像这样使用.loc选择它的一个子集
df_subs = df_mult.loc['a', ['c', 'd'], :]
给出了预期的
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
如果我现在想要再次选择df_subs的子集,例如
df_subs.loc['a', 'c', :]
工作和给予
val1 val2
ind3
0 100 70
1 101 71
2 102 72
然而
df_subs.loc[:, 'c', :]
失败并给出错误
KeyError: ‘the label [c] is not in the [columns]’
为什么这会失败?
编辑
最初,我在这篇文章中有两个问题.我把它分成了两个,第二个问题可以找到here.
解决方法:
通过使用IndexSlice:
idx = pd.IndexSlice
df_subs.loc[idx[:, 'c',:],:]
Out[159]:
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
或者您需要对行或列进行特定切片
df_subs.loc(axis=0)[:, 'c', :]
Out[196]:
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
.loc [:,’c’,:]无法工作的原因:
您应该在.loc说明符中指定所有轴,这意味着索引和列的索引器.有一些模棱两可的情况,传递的索引器可能被错误解释为索引两个轴,而不是说行的MuliIndex.
标签:python,select,dataframe,pandas,multi-index 来源: https://codeday.me/bug/20190627/1306008.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。