在表格中打印 Pandas 数据集的三列

5

假设我有以下数据:

project:  group:  sum:
A         John    12
A         Sam     10
B         Sun     4
B         Toy     5
B         Joy     7
C         Sam     11

数据存储在数据集frame_main中。 我想按项目汇总,所以进行了以下操作:
result_main = pd.concat(frame_main).groupby(["project","group"]).sum()

它基本上做到了我想要的,即对第三列进行求和并按第一列分组:

project:  group:  sum:
A         John    12
          Sam     10
B         Sun     4
          Toy     5
          Joy     7
C         Sam     11

但是,现在我正在尝试使用以下方式打印它:

print(tabulate(result_main, headers="keys", tablefmt='psql'))

它打印出来是这样的:

+---------------------------+-----------------+                                                                                       
|                           |   sum:          |                                                                                       
|---------------------------+-----------------|                                                                                       
| ('A', 'John')             |             12  |                                                                                       
| ('A', 'Sam')              |             10  |                                                                                       
| ('B', 'Sun')              |             4   |
| ('B', 'Toy')              |             5   |                                                                                       
| ('B', 'Joy')              |             7   |                                                                                       
| ('C', 'Sam')              |             11  |

我该如何打印输出结果与上方的样式相似? 我需要三列并按第一列分组。

to_excel会保留格式,但不知道你需要打印什么,所以不确定这是否对你有帮助。 - Ezer K
1
FYI.. pandas 1.0.0已添加了to_markdown方法,因此您可以执行此操作print(result_main.to_markdown(tablefmt='psql')) - Scott Boston
4个回答

4
与 @Craig 类似,我们可以在“project:”列中掩盖那些重复的值。
df_sum = df_sum.reset_index()
df_sum['project:'] = df_sum['project:'].mask(df_sum['project:'].duplicated(),'')

print(df_sum.set_index('project:').to_markdown(tablefmt='psql'))

输出:

+------------+----------+--------+
| project:   | group:   |   sum: |
|------------+----------+--------|
| A          | John     |     12 |
|            | Sam      |     10 |
| B          | Sun      |      4 |
|            | Toy      |      5 |
|            | Joy      |      7 |
| C          | Sam      |     11 |
+------------+----------+--------+

谢谢!正是我所需要的。 - jenny
@Jenny 不用谢,如果这个解决方案对你有帮助,你能否接受一下呢? - Scott Boston

2
< p > 在执行 .sum() 操作后创建的数据框具有多重索引。如果您重置索引,将获得所需的表格形式。 .reset_index() 方法允许您指定要删除哪个索引(并保留其他索引)。在您的情况下,您想保留第一个索引但不保留第二个索引,因此请使用.reset_index(level=[1]) 如下所示: < /p >
import pandas as pd
from tabulate import tabulate

result_main = pd.concat(frame_main).groupby(["project","group"]).sum()
result_main = result_main.reset_index(level=[1])
print(tabulate(result_main, headers="keys", tablefmt='psql'))

将会产生:

+-----------+---------+-------+
| project   | group   |   sum |
|-----------+---------+-------|
| A         | John    |    12 |
| A         | Sam     |    10 |
| B         | Joy     |     7 |
| B         | Sun     |     4 |
| B         | Toy     |     5 |
| C         | Sam     |    11 |
+-----------+---------+-------+

正如Scott Boston在评论中提到的那样,自Pandas 1.0.0以来,您可以使用.to_markdown()方法而不是tabulate来实现相同的功能,但仍需重置索引以获取三列。

这相当于上面代码的最后一行:

print(result_main.to_markdown(tablefmt='psql'))

1
我们可以做。
df.index=df.index.values
df
Out[350]: 
           sum
(A, John)   12
(A, Sam)    10
(B, Sun)     4
(B, Toy)     5
(B, Joy)     7
(C, Sam)    11

1
这看起来很傻,但确实可以满足你的需求:


result_main.index = [a for a in result_main.index]

输出:

           sum
(A, John)   12
(A, Sam)    10
(B, Joy)     7
(B, Sun)     4
(B, Toy)     5
(C, Sam)    11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接