Выбор повторяющихся значений многоиндексного уровня с помощью .loc - PullRequest
4 голосов
/ 21 октября 2019

Во-первых, давайте предположим, что у меня есть фрейм данных pandas с одним индексом. Если я использую .loc[], чтобы выбрать индекс 'A' дважды, он вернет фрейм данных с индексом 'A', повторенным дважды:

df_1 = pd.DataFrame([1,2,3], index=['A','B','C'], columns=['Col_1'])
df_1

    Col_1
A   1
B   2
C   3

df_1.loc[['A','A','B']]

    Col_1
A   1
A   1
B   2

Теперь давайте предположим, что у нас есть фрейм данных с мультииндексом. Если я использую .loc[] для выбора индекса 'A' дважды, он вернет фрейм данных с индексом 'A', включенным только один раз:

ix = pd.MultiIndex.from_product([['A', 'B', 'C'], ['foo', 'bar']], names=['Idx1', 'Idx2'])
data = np.arange(len(ix))
df_2 = pd.DataFrame(data, index=ix, columns=['Col_1'])
df_2

           Col_1
Idx1 Idx2       
A    foo       0
     bar       1
B    foo       2
     bar       3
C    foo       4
     bar       5

df_2.loc[['A','A','B']]


           Col_1
Idx1 Idx2   
A    foo       0
     bar       1
B    foo       2
     bar       3

Есть ли способ выбрать повторяющиеся значения мультииндексауровень с использованием .loc?

1 Ответ

4 голосов
/ 21 октября 2019

Панды пытаются сохранить уровни MultiIndex уникальными. Когда вы используете loc со списком, который ссылается на значения первого уровня MultiIndex, он будет сохранять уникальность. Если вы хотите что-то другое, вам нужно быть явным и использовать кортежи.

specific_index_values = (
    [('A', 'foo'), ('A', 'bar')] * 2 +
    [('B', 'foo'), ('B', 'bar')]
)

df_2.loc[specific_index_values, :]

           Col_1
Idx1 Idx2       
A    foo       0
     bar       1
     foo       0
     bar       1
B    foo       2
     bar       3

pandas.concat

Я считаю это неприятным, но ...

pd.concat([df_2.loc[[x]] for x in ['A', 'A', 'B']])

           Col_1
Idx1 Idx2       
A    foo       0
     bar       1
     foo       0
     bar       1
B    foo       2
     bar       3
...