Получить частичные кадры данных, используя несколько индексов - PullRequest
1 голос
/ 09 апреля 2019

У меня есть фрейм данных pandas, и я хочу получить его часть, передавая список имен как index 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 голосов
/ 09 апреля 2019

Вы близки, вам нужно tuples для одной пары:

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

Для проверки нескольких значений используйте Index.isin с MultiIndex.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.intersection с loc:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...