Pandas dataframe: группируйте по столбцу и пусть дубликаты этого столбца занимают несколько строк
У меня есть фрейм данных, и я хотел бы сгруппировать элементы по одному из столбцов, и там, где эти столбцы имеют идентичные элементы, я хотел бы сделать их одним большим элементом (охватывающим несколько строк). Наконец, мне нужно сделать его в коде latex.
Скажем, у меня есть что-то вроде
import pandas as pd
import random
table=pd.DataFrame({'a':[1,2,2,2,3,6,6],'b':[-6,-4,-3,-1,0,-1,-2],'c':random.sample(xrange(30), 7)},index=range(7))
Предоставление фрейма данных
| | a | b | c |
-----------------
| 0 | 1 |-6 | 19|
-----------------
| 1 | 2 |-4 | 12|
-----------------
| 2 | 2 |-3 | 16|
-----------------
| 3 | 2 |-1 | 23|
-----------------
| 4 | 3 | 0 | 0 |
-----------------
| 5 | 4 |-1 | 21|
-----------------
| 6 | 4 |-2 | 15|
А теперь я хотел бы сгруппировать это по столбцу a, давая что-то вроде (сохраняет ли он индекс в крайнем левом столбце, не делает материя):
| a | b | c |
-------------
| 1 |-6 | 19|
-------------
| |-4 | 12|
--------
| 2 |-3 | 16|
---------
| |-1 | 23|
-------------
| 3 | 0 | 0 |
-------------
| |-1 | 21|
---------
| 4 |-2 | 15|
Где некоторые элементы занимают несколько строк; надеюсь, вышеизложенное объясняет, что я имею в виду. Я почти получаю это, используя
summary=pd.pivot_table(table, index=['a','b'],values=['c'])
Однако это делает его многоиндексным (?), то есть
| | | c |
-------------
| a | b | |
-------------
| 1 |-6 | 19|
...
Что дает проблему при использовании
summary.to_latex()
Для получения кода latex. Кроме того, с несколькими столбцами значений pd.pivot_table() упорядочивает их по-новому, в то время как я хотел бы сохранить порядок из исходного фрейма данных. (Обратите внимание, что это будет работать еще хуже, если когда-либо были какие-либо строки, которые имели и то же самое a и b, но это не относится к моим данным)
Существует ли способ либо сгладить строки заголовка сводной таблицы в одну строку заголовка, либо сохранить порядок столбцов значений? Или это можно сделать совсем по-другому? Я изучил некоторые другие варианты, такие как pd.groupby(), но ничего не нашел.
1 ответ:
Похоже, что вам нужен латексный код, который имеет
multirowэффекты. Подходpivot_tableне дает вам этого. На самом деле, я не думаю, чтоpd.DataFrame.to_latex()будет иметь этуmultirow/объединенную ячейку для latex. Вам нужно будет написать его самому.Если вам не нужны объединенные ячейки, и вместо этого можно использовать пустые ячейки, вы можете попробовать что-то вроде:
table=pd.DataFrame({'a':[1,2,2,2,3,6,6],'b':[-6,-4,-3,-1,0,-1,-2],'c':random.sample(xrange(30), 7)},index=range(7)) table.loc[table['a'].diff() == 0, 'a'] = '' print table.to_latex(index=False) #Output \begin{tabular}{lrr} \toprule a & b & c \\ \midrule 1 & -6 & 23 \\ 2 & -4 & 2 \\ & -3 & 20 \\ & -1 & 21 \\ 3 & 0 & 5 \\ 6 & -1 & 17 \\ & -2 & 22 \\ \bottomrule \end{tabular}
Comments