Я пытаюсь переиндексировать один мультииндексный фрейм данных на основе другого мультииндексного фрейма данных.Для dfs с одиночным индексированием это работает:
index1 = range(3, 7)
index2 = range(1, 11)
values = [np.random.random() for x in index1]
df = pd.DataFrame(values, index=index1, columns=["values"])
print(df)
print(df.reindex(index2, fill_value=0))
Вывод:
values
3 0.458003
4 0.945828
5 0.783369
6 0.784599
values
1 0.000000
2 0.000000
3 0.458003
4 0.945828
5 0.783369
6 0.784599
7 0.000000
8 0.000000
9 0.000000
10 0.000000
Добавляются новые строки на основе index2
, и значение для y
устанавливается равным0
.Это то, что я ожидаю.
Теперь давайте попробуем нечто похожее для многоиндексного df:
data_dict = {
"scan": 1,
"x": [2,3,5,7,8,9],
"y": [np.random.random() for x in range(1,7)]
}
index1 = ["scan", "x"]
df = pd.DataFrame.from_dict(data_dict).set_index(index)
print(df)
index2 = list(range(4, 13))
print(df.reindex(index2, level="x").fillna(0))
Вывод:
y
scan x
1 2 0.771531
3 0.451761
5 0.434075
7 0.135785
8 0.309137
9 0.838330
y
scan x
1 5 0.434075
7 0.135785
8 0.309137
9 0.838330
Что дает?Вывод отличается от ввода: первые два значения были удалены.Но другие значения - промежуточные (например, 4
) или больше (например, 10
или выше) - отсутствуют.Чего мне не хватает?
Реальные фреймы данных имеют 6 уровней индекса и десятки или сотни строк, но я думаю, что этот код решает проблему.Я потратил немного времени на просмотр df.realign
, df.join
и много времени прочесывал SO, но я не нашел решения.Извините, если это дубликат!