Python - 尝试按年份分组并汇总销售数据时出错

Posted

技术标签:

【中文标题】Python - 尝试按年份分组并汇总销售数据时出错【英文标题】:Python - Error when trying to groupby year and summarize sales data 【发布时间】:2020-03-21 11:42:09 【问题描述】:

我有一个交易数据集,我试图按年份汇总,但是当我运行时,输出是交易的单个金额。我已经使用 pd.read_csv 将 csv 导入 python 并清理了数据框中的一些列以及添加新列。

我正在使用以下代码生成下面的输出

df['Year'] = df['Date'].dt.year
df.groupby(df['Year'])['revenue'].agg(['sum'])

OUTPUT
    Year                                       Sum
    2015      1203.21 1732.12 2551.01 1733.12 1323.44
    2016      3203.21 1532.12 4431.01 1433.12 7323.44
    2017      2203.21 122.12 131.01 1293.12 4223.44
    2018      6203.21 232.12 1131.01 1533.12 4323.44

我有以下代码行将“收入”从字符串转换为浮点数

pd.to_numeric(df['revenue'])

年份、日期和收入都是我数据框中的列。我希望能够在上面的每一年中获得一个总数,而不是查看单个交易的价值。谢谢。

【问题讨论】:

df[['Year', 'revenue']].head() 的输出是什么?看起来你正在对字符串求和。 输出是第一年数据的前四笔交易的值。我更新了原始问题以包含将字符串转换为浮点数的代码 要查看它是否可能是收入字符串,请尝试:df.groupby('Year')['revenue'].apply(lambda x: x.str.strip().astype(float).sum())。如果可行,您应该先将revenue 列转换为浮点数,然后再应用groupby 我认为你很接近,只需要分配 - df['revenue'] = pd.to_numeric(df['revenue']) 然后df['Year'] = df['Date'].dt.year df.groupby(df['Year'])['revenue'].agg(['sum']) 谢谢耶兹瑞尔。这样可行。亚历山大,如果它是一个字符串,你建议将收入转换为浮点数的代码吗? 【参考方案1】:

您可以分配 to_numeric 函数的返回输出,因为不能就地工作:

df['revenue'] = pd.to_numeric(df['revenue'])

替代解决方案:

df['revenue'] = df['revenue'].astype(float)

df['Year'] = df['Date'].dt.year 
df1 = df.groupby('Year', as_index=False)['revenue'].sum()

如果想要单行解决方案:

df1=pd.to_numeric(df['revenue']).groupby(df['Date'].dt.year.rename('Year')).sum().reset_index()

【讨论】:

解决方案出现在 6 和 7 的幂的指数中,因为我正在处理数以百万计的数字。我在转换为浮点数时删除了所有的逗号和美元符号,但我将如何将它们重新添加。 @wolfblitza - 你能检查this吗? 谢谢。这有帮助。【参考方案2】:

上面 Jezrael 提出的代码按预期工作。 我使用的是pd.to_numeric(df['revenue']),但现在已将其更改为df['revenue'] = pd.to_numeric(df['revenue'])

【讨论】:

以上是关于Python - 尝试按年份分组并汇总销售数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

Apache Scala/Python Spark 2.4.4:按年份分组数据以生成/分析新功能

核心数据按年份分组并按日期排序

在python中按特定年份对数据进行分组

s-s-rS 按年份组总计排序

绘制两行,按年份统计发生的次数* Python *

按月分组的运行计数以汇总销售额