У меня есть фрейм данных 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]
Есть ли способ сделать это в пандах?
Вы рядом, нужны 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