Сортировка столбцов Pandas DataFrame
Изучил множество топиков на сайте по этому вопросу, но либо там делается совсем не то, что мне нужно, либо я не разобрался. Если повторяюсь - извините. Задача следующая: Имеется Тета-матрица с частотным распределением, выглядит она так:
0 1 2 3 ... 10752
topic_0 2.5897 2.5047 5.8036 1.0 4.0316
topic_1 5.7798 1.5601 6.7843 0.0 1.4447
topic_2 8.0836 3.4020 2.2702 0.0 9.65861
Это матрица, в которой 3 строчки (по кол-ву тем) и почти 11 тысяч столбцов (по кол-ву документов в моделировании). Мне нужно, чтобы в левой части собрались столбцы с наибольшими значениями, не теряя при этом номер столбца. Понимаю, что это можно сделать только для соответствующей строки по отдельности. Итог я вижу примерно так:
11232 1345 9 9854 ... 3
topic_0 10.5897 10.5047 9.8036 9.3584 1.0
Как отсортировать столбцы по значению по убыванию не теряя их индекс для соответствующей строки? Более простой пример:
0 1 2
topic_0 1 5 3
topic_1 0 2 1
topic_2 3 6 7
Выходные данные при сортировке по первой теме (строке):
1 2 0
topic_0 5 3 1
Выходные данные при сортировке по второй теме (строке):
1 2 0
topic_1 2 1 0
И по третьей строке:
2 1 0
topic_2 7 6 3
Это покажет нам, что наибольшее влияние на тему 0 и 1 оказывает первый документ, а не тему 2 - второй документ.
Ответы (2 шт):
На вашем частичном примере:
0 1 2 3 10752
topic_0 2.5897 2.5047 5.8036 1.0 4.03160
topic_1 5.7798 1.5601 6.7843 0.0 1.44470
topic_2 8.0836 3.4020 2.2702 0.0 9.65861
Добавляем ряд с суммами колонок матрицы, затем сортируем по этому ряду:
df.loc['sums']= df.sum()
df=df.sort_values(by='sums', axis=1, ascending=False)
Получаем:
0 10752 2 1 3
topic_0 2.5897 4.03160 5.8036 2.5047 1.0
topic_1 5.7798 1.44470 6.7843 1.5601 0.0
topic_2 8.0836 9.65861 2.2702 3.4020 0.0
sums 16.4531 15.13491 14.8581 7.4668 1.0
Можно также сразу удалить ряд с суммой, если он вам не нужен:
df=df.sort_values(by='sums', axis=1, ascending=False).drop('sums')
Результат:
0 10752 2 1 3
topic_0 2.5897 4.03160 5.8036 2.5047 1.0
topic_1 5.7798 1.44470 6.7843 1.5601 0.0
topic_2 8.0836 9.65861 2.2702 3.4020 0.0
Пример исходного DF:
In [83]: df
Out[83]:
a b c
topic_0 1 5 3
topic_1 0 2 1
topic_2 3 6 7
решение:
res = {i:df.loc[i].sort_values(ascending=False) for i in df.index}
результат:
In [14]: res
Out[14]:
{'topic_0': 1 5
2 3
0 1
Name: topic_0, dtype: int64, 'topic_1': 1 2
2 1
0 0
Name: topic_1, dtype: int64, 'topic_2': 2 7
1 6
0 3
Name: topic_2, dtype: int64}
In [15]: res["topic_0"]
Out[15]:
1 5
2 3
0 1
Name: topic_0, dtype: int64
In [16]: res["topic_0"].to_frame().T
Out[16]:
1 2 0
topic_0 5 3 1
In [17]: res["topic_2"]
Out[17]:
2 7
1 6
0 3
Name: topic_2, dtype: int64
In [18]: res["topic_2"].to_frame().T
Out[18]:
2 1 0
topic_2 7 6 3