Выбор всех строк с одним субиндексом в Pandas MultiIndex Dataframe

1

У меня есть следующая таблица в Pandas Dataframe с MultiIndex (строка, атрибут). У меня есть аналогичные dataframes, которые содержат значения для класса и для вероятности, но эти данные имеют один индекс (строка).

                    1   2   3   4   5   6   7   8   9   10  ...     69  70  71  72  73  74  75  76  77  78
row     attribute                                                                                   
0       class       -   -   -   -   -   -   -   -   -   -   ...     -   -   -   -   -   -   -   -   -   -
        probability -   -   -   -   -   -   -   -   -   -   ...     -   -   -   -   -   -   -   -   -   -
1       class       -   -   -   -   -   -   -   -   -   -   ...     -   -   -   -   -   -   -   -   -   -
        probability -   -   -   -   -   -   -   -   -   -   ...     -   -   -   -   -   -   -   -   -   -
2       class       -   -   -   -   -   -   -   -   -   -   ...     -   -   -   -   -   -   -   -   -   -
        probability -   -   -   -   -   -   -   -   -   -   ...     -   -   -   -   -   -   -   -   -   -

Как я могу теперь задать значения всех строк с атрибутом = 'class' для значений в другой фреймворке с правильной формой? И аналогично для "вероятности". Я пробовал следующее:

df.loc[df.attribute == "class"] = labels[sorted.values]

что приводит к

AttributeError: 'DataFrame' object has no attribute 'attribute'

Я очень новичок в MultiIndex, поэтому любые подсказки оценены, большое спасибо!

Теги:
pandas
dataframe
multi-index

1 ответ

0
Лучший ответ

Мне кажется, нужно:

df.loc[df.index.get_level_values("attribute") == "class"] = labels[sorted.values]

Образец:

np.random.seed(789)
mux = pd.MultiIndex.from_product([np.arange(3), ['class','probability']],
                                  names=('row','attribute'))

df = pd.DataFrame(np.random.randint(10, size=(6, 10)), index=mux)
print (df)
                 0  1  2  3  4  5  6  7  8  9
row attribute                                
0   class        3  2  1  3  4  8  4  1  8  0
    probability  1  1  9  8  9  4  1  4  1  3
1   class        8  1  4  9  6  5  3  5  4  9
    probability  7  6  6  5  0  8  5  4  8  1
2   class        1  4  2  6  5  9  0  6  2  8
    probability  8  8  9  1  4  2  1  5  5  9

labels = pd.DataFrame(np.random.randint(2, size=(2, 10)), index=['class','probability'])
print (labels)
             0  1  2  3  4  5  6  7  8  9
class        0  0  1  1  0  0  0  0  0  1
probability  1  1  0  0  0  0  0  1  0  0

Если вы хотите, чтобы значения repalce повторяющимися строками использовали numpy.repeat:

mask = df.index.get_level_values("attribute") == "class"
df.loc[mask] = np.repeat(labels.loc[['class']].values, mask.sum(), axis=0)
print (df)
                 0  1  2  3  4  5  6  7  8  9
row attribute                                
0   class        0  0  1  1  0  0  0  0  0  1
    probability  1  1  9  8  9  4  1  4  1  3
1   class        0  0  1  1  0  0  0  0  0  1
    probability  7  6  6  5  0  8  5  4  8  1
2   class        0  0  1  1  0  0  0  0  0  1
    probability  8  8  9  1  4  2  1  5  5  9

Деталь:

print (np.repeat(labels.loc[['class']].values, mask.sum(), axis=0))
[[0 0 1 1 0 0 0 0 0 1]
 [0 0 1 1 0 0 0 0 0 1]
 [0 0 1 1 0 0 0 0 0 1]]
  • 0
    Бывший работает отлично, спасибо! Последний по-прежнему дает мне старый: KeyError: 'attribute'
  • 0
    @rize - Спасибо, также был создан образец.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню