【问题标题】:pd.groupby gives multiple rows per unique value in grouping columnpd.groupby 在分组列中为每个唯一值提供多行
【发布时间】:2020-09-08 15:36:39
【问题描述】:

我有一个dataframe(更具体地说,是一个文档术语矩阵),其中最后一列是“YEAR”。列中有五个独特的年份:2016 年、2017 年、2018 年、2019 年、2020 年。这证实了:

In [1]: len(set(df.YEAR))
Out[1]: 5

但是,当我运行代码时

df.groupby(df.YEAR).head()

生成的 dataframe.groupby 对象有 25 行:前 5 行 YEAR = 2016,后 5 行 YEAR = 2017,以此类推。

首先,有没有办法让结果成为一个新的dataframe 而不是dataframe.groupby 对象?

其次,为什么每年有 5 行而不是 1 行?我如何做到这一点,所以每年只有一排?

如果我将 YEAR 列更改为 DATE(使用 datetime 值)并使用 df.groupby(df.DATE.dt.year),我仍然会得到 25 行,前 5 行在 DATE 列中具有以下值:2016-01 -01, 2016-01-02, 2016-01-03, 2016-01-04, 2016-01-05

我尝试了df.groupby(df.YEAR).nunique(),虽然这导致dataframe 有5 行,但它不能正确汇总字数。

我还尝试使用 df.set_index(df.DATE) 将索引设置为 DatetimeIndex,尽管 DATE 列已确认为日期时间:

In [2]: df.dtypes
Out[2]: DATE         datetime64[ns]

当我尝试df.resample('Y')pd.Grouper 或类似的东西时,我得到TypeError: Only valid with DatetimeIndex, TimedeltaIndexorPeriodIndex, but got an instance of 'RangeIndex'

我该怎么办?这看起来应该很简单,但 groupby 并没有按我的预期工作。

【问题讨论】:

  • head() 默认为 5 行;你抓住每组年份的head,所以 5 组 x​​ 每组 5 行 = 25 行,这就是你所看到的。聚合不一定会折叠为每个组的单个值,这取决于聚合函数是什么。您可以在此处阅读有关逻辑的一些信息:stackoverflow.com/questions/61810108/…
  • 这很有道理,谢谢。我曾假设 groupby 对这些值求和,但事实并非如此。为了得到我要找的东西,我必须做 df.groupby(df.YEAR).sum()。

标签: python pandas dataframe pandas-groupby


【解决方案1】:

我同意@ALollz 您可以尝试此代码以获得清晰的图片。另外,如果我错了,请纠正我。 df_groupby = df.groupby('YEAR')。现在,如果您尝试df_groupby.first(),那么您将获得新数据框的所有第一个条目。此外,df_groupby.get_group('2017') 将提供 2017 年的所有结果。

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多