#python #pandas #indexing #multi-index
#python #панды #индексирование #многоиндексный
Вопрос:
Индексирование в фрейм данных Pandas выдает ошибку, когда:
- Запрос содержит несколько копий одного и того же значения.
- Индекс в фрейме данных является одноуровневым многоиндексом.
Приведенный ниже код показывает простой пример
import pandas as pd
# columns as str class -- works
D = pd.DataFrame([[1,2]], columns = ['A','B'], index = ['R1'])
print(D.loc[:,['A','A']], 'n') # OK
# columns as Index class -- works
D = pd.DataFrame([[1,2]], columns = pd.Index(['A','B']), index = ['R1'])
print(D.loc[:,['A','A']], 'n') # OK
# columns as single-level MultiIndex -- fails
D = pd.DataFrame([[1,2]], columns = pd.MultiIndex.from_arrays([['A','B']]), index = ['R1'])
print(D.loc[:,['A','A']]) # error "Index._join_level on non-unique index is not implemented"
В последнем случае D.columns
MultiIndex([('A',),
('B',)],
)
Почему это происходит? Какой самый простой способ это исправить?
В моей программе я не создаю столбцы фрейма данных напрямую (как я делаю в простом примере выше); вместо этого он получается с помощью команды drop_level (создавая одноуровневый многоиндекс). Итак, простое создание фрейма данных с использованием класса Index не является вариантом.
Комментарии:
1. @cs95 это происходит в результате операции «drop_level». В частности, для трансляции индекса от малого к большому фрейму данных (извините, копирование-вставка убивает разрыв строки) # Требуется: уровни с именами соответствуют def broadcast(dfSm, dfBig): # отбрасывать уровни не в именах def get_level_subset(midx, names): вернуть midx.droplevel(midx.names.difference(имена)) # chop = [get_level_subset(dfBig.axes[i], dfSm.axes[i].имена) для i в [0,1]] возвращает pd.DataFrame(dfSm.loc[chop[0], chop[1]].значения, индекс = dfBig.index, столбцы = dfBig.столбцы)
2. Вы можете исправить проблему с одноуровневым многоиндексом, сгладив свой индекс:
D.columns = D.columns.get_level_values(0)