在pandas中使用.multiIndex的.loc
有没有人知道能不能用 DataFrame.loc
方法从 MultiIndex
中选择数据?我有一个 DataFrame
,想要访问在 Dwell
列中,索引为 ('at', 1)
、('at', 3)
、('at', 5)
等等(这些索引不是连续的)的值。
我希望能像这样使用 data.loc[['at',[1,3,5]], 'Dwell']
,这和普通索引的 data.loc[[1,3,5], 'Dwell']
语法类似(后者会返回一个包含三个 Dwell
值的系列)。
我的目的是选择数据的一个任意子集,只对这个子集进行一些分析,然后用分析结果更新这些新值。我打算用相同的语法来设置这些数据的新值,所以在这种情况下,链式选择就不太适用了。
这是我正在处理的 DataFrame
的一部分:
Char Dwell Flight ND_Offset Offset
QGram
at 0 a 100 120 0.000000 0
1 t 180 0 0.108363 5
2 a 100 120 0.000000 0
3 t 180 0 0.108363 5
4 a 20 180 0.000000 0
5 t 80 120 0.108363 5
6 a 20 180 0.000000 0
7 t 80 120 0.108363 5
8 a 20 180 0.000000 0
9 t 80 120 0.108363 5
10 a 120 180 0.000000 0
4 个回答
3
一般来说,MultiIndex的键是以元组的形式出现的。比如:
In [6]: df.loc[('at', 1),'Dwell']
Out[6]: 180
在你的情况下,你需要传递一个元组的列表。例如,下面的代码就能按你预期的那样工作:
In [7]: df.loc[ [('at', 1),('at', 3),('at', 5)], 'Dwell']
Out[7]:
Dwell
QGram
at 1 180
at 3 180
at 5 80
5
loc
方法在处理多重索引时非常好用。不过,你需要明白在多重索引上使用 loc 是怎么回事。当你在多重索引上使用 loc 时,必须在 loc 中指定每一个其他的索引值,比如:
df.loc['indexValue1', 'indexValue2', 'indexValue3']
不过,正如你想象的那样,如果你不知道所有其他的值,这样做可能会很麻烦,所以我们当然可以使用 ':' 来代替。
df.loc[:, 'value1', 'value2', :]
希望这对你有帮助!
20
试试这个交叉截面索引的方法:
In [68]: df.xs('at', level='QGram', drop_level=False).loc[[1,4]]
Out[68]:
Char Dwell Flight ND_Offset Offset
QGram
at 1 t 180 0 0.108363 5
4 a 20 180 0.000000 0
75
如果你使用的是0.14版本,你可以像下面这样直接把一个元组传给.loc
:
df.loc[('at', [1,3,4]), 'Dwell']