如何在pandas中按值对Series进行分组?

95

我现在有一个 pandas 的 Series,其中包含 Timestamp 的数据类型,并且我想按日期对其进行分组(每个组中有许多具有不同时间的行)。

看起来很明显的方法是类似于以下方式:

grouped = s.groupby(lambda x: x.date())

不过,pandas的groupby按索引对Series进行分组。我该如何使其按值进行分组?


1
如果我理解正确,grouped = s.groupby(s.dt.date) 不起作用吗?你想实现什么? - EdChum
https://dev59.com/Z2Mm5IYBdhLWcg3wB7d5 - luca
5个回答

136
grouped = s.groupby(s)
或者:
grouped = s.groupby(lambda x: s[x])

133
是我想多了还是s.groupby()不能用有点荒谬? - BallpointBen
2
你说得对,Python并不是为了在数据科学中执行groupby而发明的XD。 - Seymour
对于 ts.cumsum().groupby(ts.cumsum()).count(),最好使用链式方法,否则需要多次计算而没有变量。 - Mithril
它对我不起作用:它只是说:<pandas.core.groupby.generic.SeriesGroupBy object at 0x000002AD0136A1F0>。 - M_Idk392845

12

三种方法:

DataFrame: pd.groupby(['column']).size()

Series: sel.groupby(sel).size()

Series 转 DataFrame:

pd.DataFrame(sel, columns=['column']).groupby(['column']).size()


sel 是什么? - undefined
@自由职业顾问 这是一个Series对象的名称。 - undefined

10

如果有其他人想要在不使用lambda表达式的情况下进行内联操作(这往往会影响性能):

s.to_frame(0).groupby(0)[0]

3

您应该将其转换为DataFrame,然后添加一个列作为date()。可以在带有日期列的DataFrame上进行groupby。

df = pandas.DataFrame(s, columns=["datetime"])
df["date"] = df["datetime"].apply(lambda x: x.date())
df.groupby("date")

那么 "date" 就变成了你的索引。你必须这样做,因为最终分组对象需要一个索引,以便您可以执行像选择一组之类的操作。


1
为了提供另一个建议,我经常使用以下方法,因为它使用简单的逻辑:
pd.Series(index=s.values).groupby(level=0)

这是基于索引值而非值本身的操作。你会得到共享相同索引值的组(例如,如果你的索引是日期,则会得到相同日期的组)。 - Adrian
仔细看一下,或者试一下,你会发现它是在值本身上工作的,因为我使用了 index=s.values。如果我使用了 pd.Series(s.values).groupby(level=0),那么你就是正确的。 - mchl_k
是的,我再次查看了一下,第一次阅读时我误解了,对此我表示道歉。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接