У меня есть следующая таблица в 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, поэтому любые подсказки оценены, большое спасибо!
Мне кажется, нужно:
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]]