Я пытаюсь добавить новую строку в мой фрейм данных MultiIndex на основе более чем одного условия.
Следующий код показывает, как я устанавливаю исходный фрейм данных, с которым я хочу работать (не реальный, нодостаточно хорошо, чтобы проиллюстрировать проблему, с которой я сталкиваюсь ...):
def mklbl(prefix, n):
return ["%s%s" % (prefix, i) for i in range(n)]
----
miindex = pd.MultiIndex.from_product([mklbl('A', 3),
mklbl('B', 4),
], names=['A','B'])
micolumns = pd.MultiIndex.from_tuples([('a', 'foo'), ('a', 'bar'),
('b', 'foo'), ('b', 'bah')],
names=['lvl0', 'lvl1'])
df = pd.DataFrame(np.random.randint(100, size=len(miindex) * len(micolumns))
.reshape((len(miindex), len(micolumns))),
index=miindex,
columns=micolumns).sort_index().sort_index(axis=1)
df = df.drop([('A2','B2'),('A2','B3')])
Вот начало df
:
lvl0 a b
lvl1 bar foo bah foo
A B
A0 B0 38 16 1 31
B1 49 12 97 73
B2 76 26 17 34
B3 8 55 6 80
A1 B0 40 94 57 0
B1 21 23 45 78
B2 36 31 89 18
B3 46 31 57 94
A2 B0 46 98 62 97
B1 89 26 93 95
Вопрос: как мне создатьновый индекс такой, что в каждом A
, который имеет B2
и B3
записей, если B3 < B2
, то B4 = B3 / B2
else B4 = 0
;
Я ожидаю, что результат будет таким:
lvl0 a b
lvl1 bar foo bah foo
A B
A0 B0 38 16 1 31
B1 49 12 97 73
B2 76 26 17 34
B3 8 55 6 80
B4 0.105 0 0.352 0
A1 B0 40 94 57 0
B1 21 23 45 78
B2 36 31 89 18
B3 46 31 57 94
B4 0 0 0.640 0
A2 B0 46 98 62 97
B1 89 26 93 95
Это очень трудно для меня сделать.Я пытался сделать это самостоятельно в течение всего дня, используя pd.IndexSlice
, get_level_values
, boolean indexer
, а что нет, но безрезультатно.Это так расстраивает.
Спасибо за любую помощь.