在Pandas(Python)中按数据分组的总和

时间:2018-03-01 15:48:51

标签: python pandas dataframe

对于我的任务,我需要了解一些Python Pandas Code,以便使用另一种编程语言(Java)进行一些修改和重新实现。 我参加了一些在线教程,但仍然存在熊猫问题。例如,这一行:

uniq_page_df = df.groupby(["asin", "views_count"])
uniq_page_df = uniq_page_df.sum().reset_index()
sum_views_count = int(uniq_page_df["views_count"].sum())

在这部分中,据我所知,作者试图计算总观看次数。所以我的问题是,为什么我们需要分组并计算每组的总和(第2行),然后计算总和(第3行)?为什么我们不能在没有分组的情况下计算出来?或者我没有正确理解这部分代码。

另一个问题是,为什么在第2行计算reset_index()后我们需要sum()

更新:数据框中的所有列均为:asin,product_group,category_description,views_count

2 个答案:

答案 0 :(得分:0)

我会编制一些数据,因为它更容易描述发生了什么。

这就是我认为您的代码正在尝试做的事情以及更简单的替代方案:

import pandas as pd

df = pd.DataFrame([[1, 10, 5], [2, 20, 10], [1, 10, 15],
                   [3, 30, 20], [2, 20, 25], [1, 10, 30]],
                  columns=['asin', 'views_count', 'col'])

s = int(df.groupby(['asin', 'views_count']).sum().reset_index()['views_count'].sum())
# 60

t = df.drop_duplicates(['asin', 'views_count'])['views_count'].sum()
# 60

第一次尝试是隔离唯一asin&的数据。通过view_count groupby组合。要再次查询所需的列,将调用reset_index。然后将小计最后一次求和。但是你可以通过删除重复的行来做同样的事情。

答案 1 :(得分:0)

对于你的第一个问题,看起来作者在这里计算两个不同的东西 - 你说这是多余的是正确的。只需运行df['views_count'].sum()将返回与最后一行相同的值。

对于第二个问题,当您预先形成groupby().sum()时,pandas会返回一个数据框,其索引是该组中使用的键 - 在这种情况下,索引值将为asin并且views_countreset_index()将重新创建从0开始的默认索引,以便可以像普通列一样访问和处理views_countasin。更好的方法可能是:

#To get total views:
sum_views_count = df['views_count'].sum()

#To get views by page:
unique_page_views = df.groupby(['asin', 'views_count']).sum()

#To get the original dataframe structure back
unique_page_views = unique_page_views.reset_index()

请参阅https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.htmlhttps://pandas.pydata.org/pandas-docs/stable/indexing.html了解详情。