使用多个索引获取部分DataFrame

时间:2019-04-09 12:50:22

标签: python-3.x pandas dataframe

我有一个pandas数据框,我想通过传递一个名称列表作为索引1和index2来获得它的一部分:

这是我的数据框示例:

| index1  |  index2  |        |
|-----------------------------|
| chicago |  rome    |  0.22  |
| berlin  |  praha   |  1.22. |
...

我想获得一个新的数据框,它只包含index1和index2在城市列表中的元组。

如果我这样做:

df.loc['chicago', 'rome']

我得到0.22,但是我想传递index1和2中的城市列表:

df.loc[list_ofCities1, list_ofCities2]

大熊猫有什么办法吗?

1 个答案:

答案 0 :(得分:0)

您很亲密,一对需要tuples

df.loc[('chicago', 'rome')]

要检查多个值,请使用Index.isinMultiIndex.get_level_values

m1 = df.index.get_level_values(0).isin(list_ofCities1) 
m2 = df.index.get_level_values(1).isin(list_ofCities2)

df = df[m1 & m2]

Index.isin和带有boolean indexing的元组列表:

df = df.loc[df.index.isin(list(zip(list_ofCities1, list_ofCities2)))]

示例

df = pd.DataFrame({
        'A':list('abcdec'),
         'E':[5,3,6,9,2,4],
         'F':list('aaabgg')
}).set_index(['A','F'])['E']


list_ofCities1 = list('abc')
list_ofCities2 = list('ang')

df = df[df.index.isin(list(zip(list_ofCities1, list_ofCities2)))]
print (df)
A  F
a  a    5
c  g    4
Name: E, dtype: int64

另一个想法是将Index.intersectionloc一起使用:

df = df.loc[df.index.intersection(list(zip(list_ofCities1, list_ofCities2)))]
print (df)
A  F
a  a    5
c  g    4
Name: E, dtype: int64