【问题标题】:Group (sum) by Month, Year and another Variable in Python在 Python 中按月、年和另一个变量分组(总和)
【发布时间】:2020-07-08 22:37:31
【问题描述】:

我对编程很陌生,我正在使用 Python 进行数据操作和分析。

我有一个看起来像这样的数据框:

Brand   Date    Unit
A       1/1/19  10
B       3/1/19  11
A       11/1/19 15
B       11/1/19 5
A       1/1/20  10
A       9/2/19  18
B       12/2/19 11
B       19/2/19 8
B       1/1/20  5

我想按月、年和品牌分组。如果有帮助,我还有单独的月份和年份列。预期结果应如下所示:

Brand   Date    Unit
A       Jan 2019  25
B       Jan 2019  16
A       Feb 2019  18
B       Feb 2019  19
A       Jan 2020  8
B       Feb 2020  5

我尝试改编别人问题的答案:

per = df.Date.dt.to_period("M")
g = df.groupby(per,'Brand')
g.sum()

但我收到提示:

ValueError: No axis named Brand for object type <class 'pandas.core.frame.DataFrame'>

我不知道如何解决这个问题。

我曾经通过单独选择每个月/年,按总和分组然后创建字典来使用字典来执行此操作,但这似乎是一种蛮力,非常粗糙,如果 df 更新为新的,这将无济于事数据。

更重要的是,也许我对这种情况的态度不好。最后,我希望 df 看起来像:

Brand    Jan 19   Feb 19   Jan 20 
A        25       18       8
B        16       19       5

【问题讨论】:

  • 谢谢!非常有用的信息,我对此一无所知,确实它使我走上了正轨。但是,它看起来仍然无法解决按日期分组的问题,因为日期本质上是独一无二的,因为它还包括日期(日期“太”独特了?)。也许如果我创建另一列没有日期(2019 年 1 月 1 日 -> 2019 年 1 月)?
  • Groupby 想要一个列表g = df.groupby([per,'Brand'])

标签: python pandas group-by


【解决方案1】:

使用pandas.to_datetimepandas.DataFrame.pivot_table

df["Date"] = pd.to_datetime(df["Date"], dayfirst=True).dt.strftime("%b %Y")
new_df = df.pivot_table(index="Brand", columns="Date", aggfunc=sum)
print(new_df)

输出:

          Unit                  
Date  Feb 2019 Jan 2019 Jan 2020
Brand                           
A           18       25       10
B           19       16        5

【讨论】:

  • 对字符串执行此操作并不适合您所看到的排序
  • 我对你的回答做了一点修改,效果很好。 df["Date"] = pd.to_datetime(df["Date"], dayfirst=True).dt.strftime("%b %Y") df = df.groupby(by=['Brand','Date'],as_index=False).sum() df = df.pivot_table(index="Brand", columns="Date", aggfunc=sum) 由于没有分组,它的表现有点出乎意料。非常感谢。我将继续学习旋转。
【解决方案2】:

你很接近,DataFrame.groupby 想要一份石斑鱼列表,而不是单纯的争论。

我是这样做的:

import pandas
from io import StringIO

csv = StringIO("""\
Brand   Date    Unit
A       1/1/19  10
B       3/1/19  11
A       11/1/19 15
B       11/1/19 5
A       1/1/20  10
A       9/2/19  18
B       12/2/19 11
B       19/2/19 8
B       1/1/20  5
""")

(
    pandas.read_csv(csv, parse_dates=['Date'], sep='\s+', dayfirst=True)
        .groupby(['Brand', pandas.Grouper(key='Date', freq='1M')])
        .sum()
        .reset_index()
)

这给了我:

  Brand       Date  Unit
0     A 2019-01-31    25
1     A 2019-02-28    18
2     A 2020-01-31    10
3     B 2019-01-31    16
4     B 2019-02-28    19
5     B 2020-01-31     5

【讨论】:

  • 它给了我这个错误:TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但有一个“Index”实例我不能使用这个:( 但是,df["Date"] = pd.to_datetime(df["Date"], dayfirst=True).dt.strftime("%b %Y") 工作得很好. 也许我应该提到日期是 datetime64 格式而不是字符串。
  • 是的,如果你有日期作为字符串,让它们成为正确的熊猫时间戳,生活变得更轻松
猜你喜欢
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多