【发布时间】: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