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(), но ничего не нашел.

641   1  

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

    Ничего не найдено.