使用Python按列分组并汇总另一列的内容

Posted

技术标签:

【中文标题】使用Python按列分组并汇总另一列的内容【英文标题】:Group By a Column and Sum contents of another column with Python 【发布时间】:2016-12-31 04:49:16 【问题描述】:

我有一个数据框merged_df_energy

+------------------------+------------------------+------------------------+--------------+
| ACT_TIME_AERATEUR_1_F1 | ACT_TIME_AERATEUR_1_F3 | ACT_TIME_AERATEUR_1_F5 | class_energy |
+------------------------+------------------------+------------------------+--------------+
| 63.333333              | 63.333333              | 63.333333              | low          |
| 0                      | 0                      | 0                      | high         |
| 45.67                  | 0                      | 55.94                  | high         |
| 0                      | 0                      | 23.99                  | low          |
| 0                      | 20                     | 23.99                  | medium       |
+------------------------+------------------------+------------------------+--------------+

我想为每个 ACT_TIME_AERATEUR_1_FxACT_TIME_AERATEUR_1_F1ACT_TIME_AERATEUR_1_F3ACT_TIME_AERATEUR_1_F5)创建一个包含以下列的数据框:class_energysum_time

例如ACT_TIME_AERATEUR_1_F1对应的dataframe:

+-----------------+-----------+
|  class_energy   | sum_time  |
+-----------------+-----------+
| low             | 63.333333 |
| medium          | 0         |
| high            | 45.67     |
+-----------------+-----------+

我要做的就是这样使用组:

data.groupby(by=['class_energy'])['sum_time'].sum()

我该怎么做?

【问题讨论】:

【参考方案1】:

您可以将所有列添加到[] 以进行聚合:

print (df.groupby(by=['class_energy'])['ACT_TIME_AERATEUR_1_F1', 'ACT_TIME_AERATEUR_1_F3','ACT_TIME_AERATEUR_1_F5'].sum())
              ACT_TIME_AERATEUR_1_F1  ACT_TIME_AERATEUR_1_F3  \
class_energy                                                   
high                       45.670000                0.000000   
low                        63.333333               63.333333   
medium                      0.000000               20.000000   

              ACT_TIME_AERATEUR_1_F5  
class_energy                          
high                       55.940000  
low                        87.323333  
medium                     23.990000  

你也可以使用参数as_index=False:

print (df.groupby(by=['class_energy'], as_index=False)['ACT_TIME_AERATEUR_1_F1', 'ACT_TIME_AERATEUR_1_F3','ACT_TIME_AERATEUR_1_F5'].sum())
  class_energy  ACT_TIME_AERATEUR_1_F1  ACT_TIME_AERATEUR_1_F3  \
0         high               45.670000                0.000000   
1          low               63.333333               63.333333   
2       medium                0.000000               20.000000   

   ACT_TIME_AERATEUR_1_F5  
0               55.940000  
1               87.323333  
2               23.990000  

如果只需要聚合前3 列:

print (df.groupby(by=['class_energy'], as_index=False)[df.columns[:3]].sum())
  class_energy  ACT_TIME_AERATEUR_1_F1  ACT_TIME_AERATEUR_1_F3  \
0         high               45.670000                0.000000   
1          low               63.333333               63.333333   
2       medium                0.000000               20.000000   

   ACT_TIME_AERATEUR_1_F5  
0               55.940000  
1               87.323333  
2               23.990000  

...或所有没有最后一个的列:

print (df.groupby(by=['class_energy'], as_index=False)[df.columns[:-1]].sum())
  class_energy  ACT_TIME_AERATEUR_1_F1  ACT_TIME_AERATEUR_1_F3  \
0         high               45.670000                0.000000   
1          low               63.333333               63.333333   
2       medium                0.000000               20.000000   

   ACT_TIME_AERATEUR_1_F5  
0               55.940000  
1               87.323333  
2               23.990000  

【讨论】:

感谢您的支持。我可以编辑您的问题以提高可读性吗?

以上是关于使用Python按列分组并汇总另一列的内容的主要内容,如果未能解决你的问题,请参考以下文章

按列分组,结果限制并按另一列轨道排序

按列分组以查找另一列中出现频率最高的值? [复制]

按列分组,优先选择另一列不为空的行

应用 group_by 并汇总数据,同时保留所有列的信息

我需要连接三个表,将结果按一列分组,并显示另一列的最大值

如何按一列分组并对另一列的值进行排序?