У меня есть большой кадр данных pandas с данными временных рядов и довольно большим мультииндексом. Указанный индекс содержит различную информацию о временных рядах, такую как, например, местоположение, тип данных и т.д.
Теперь я хочу добавить в индекс новую строку с целым числом (или с плавающей запятой, не имеет большого значения), содержащим расстояние до определенной точки. После этого я хочу отсортировать кадр данных по этому расстоянию.
Я не знаю, как добавить новый уровень индекса и как присвоить новые значения вручную. Кроме того, могут ли панды даже сортировать столбцы после случайного числа на одном из уровней индекса?
Пример
(код из здесь)
header=pd.MultiIndex.from_product([['location1','location2'],['S1','S2','S3']],names=['loc','S'])
df = pd.DataFrame(np.random.randn(5, 6), index=['a','b','c','d','e'], columns = header)
Выглядит так:
loc location1 location2
S S1 S2 S3 S1 S2 S3
a 1.530590 0.536364 1.295848 0.422256 -1.853786 1.334981
b 0.275857 -0.848685 -1.212584 -0.464235 -0.855600 0.680985
c -1.209607 0.265359 -0.695233 0.643896 1.315216 -0.751027
d -1.591613 -0.178605 0.878567 0.647389 -0.454313 -1.972509
e 1.098193 -0.766810 0.087173 0.714301 -0.886545 -0.826163
То, что я хочу сделать, это на первом этапе добавить некоторые расстояния к каждому столбцу, например location1 S1 add dist 200
, location1 S2 add dist 760
и т. д., в результате чего получится следующее:
loc location1 location2
S S1 S2 S3 S1 S2 S3
dist 200 760 10 1000 340 70
a 1.530590 0.536364 1.295848 0.422256 -1.853786 1.334981
b 0.275857 -0.848685 -1.212584 -0.464235 -0.855600 0.680985
c -1.209607 0.265359 -0.695233 0.643896 1.315216 -0.751027
d -1.591613 -0.178605 0.878567 0.647389 -0.454313 -1.972509
e 1.098193 -0.766810 0.087173 0.714301 -0.886545 -0.826163
А затем сделайте что-то вроде df.sortlevel('dist')
, в результате чего
loc location1 location2 location1 location2 location1 location2
S S3 S3 S1 S2 S2 S1
dist 10 70 200 340 760 1000
a 1.295848 1.334981 1.530590 -1.853786 0.536364 0.422256
b -1.212584 0.680985 0.275857 -0.855600 -0.848685 -0.464235
…
Так что все это отсортировано по расстоянию для таких вещей, как plt.matshow(df.corr())
.
Могут ли панды даже сортировать df после случайного индекса с целым числом? Потому что у меня есть другой кадр данных, в мультииндексе которого уже есть целое число, и здесь some_otherdf.sortlevel('HZB')
приводит к TypeError: can only sort by level with a hierarchical index
Изменить:
На данный момент есть два ответа, оба из которых отлично подходят для моего тестового примера. Я думаю, что ответ @Pedro M Duarte может быть более правильным, учитывая, что он использует мультииндекс по назначению. Однако для моих реальных данных потребуется либо много переделки, либо много ввода для 7-уровневого глубокого мультииндекса и 50 рядов данных, что очень подвержено ошибкам. @Nader Hisham проигнорировал мою просьбу остаться в моем мультииндексе, но для этого требуется просто быстро, легко и просто проверить запись простой строки чисел (сэкономив мне много времени), которую я затем могу удалить после сортировки. для других людей с похожим вопросом это может быть иначе.