我有一个如下所示的数据框:
import pandas as pd
import numpy as np
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame([[24, 13, 8, 9],
[11, 30, 7, 23],
[21, 31, 12, 30],
[ 2, 5, 19, 24],
[15, 18, 3, 16],
[ 2, 24, 28, 11],
[23, 9, 6, 12],
[29, 28, 11, 21]], index=arrays, columns=list('abcd'))
df
a b c d
bar one 24 13 8 9
two 11 30 7 23
baz one 21 31 12 30
two 2 5 19 24
foo one 15 18 3 16
two 2 24 28 11
qux one 23 9 6 12
two 29 28 11 21
我想对数据框进行切片,使得结果包含所有行,其中foo
作为第一个索引的值,所有行bar
作为第一级索引,two
作为二级指数。
即生成的数据框应如下所示:
a b c d
bar two 11 30 7 23
foo one 15 18 3 16
two 2 24 28 11
获得此结果的一种方法是
pd.concat([df.loc[[('bar', 'two')],:], df.loc[('foo', slice(None)),:]])
但这感觉就像一种非常麻烦的方式,必须有更多的" pythonic"方式..
答案 0 :(得分:3)
i = df.index.get_level_values('age')
print (i)
Int64Index([8, 12, 0, 14, 12, 0], dtype='int64', name='age')
df = df[(i >= 10) & (i <= 20)].sum(level=0)
print (df)
A B
year
1895 13 14
1965 97 56
救援:
query
df.query('ilevel_0 == "foo" or (ilevel_0 == "bar" and ilevel_1 == "two")')
a b c d
bar two 11 30 7 23
foo one 15 18 3 16
two 2 24 28 11
,xs
等都失败了,因为您对各个级别的切片不一致。
答案 1 :(得分:1)
您可以使用默认切片
l0 = df.index.get_level_values(0)
l1 = df.index.get_level_values(1)
cond = (l0 == "foo") | ((l0=="bar") & (l1=="two"))
df[cond]
输出
a b c d
bar two 11 30 7 23
foo one 15 18 3 16
two 2 24 28 11