【问题标题】:Apply function to a filtered group after groupby在 groupby 之后将函数应用于过滤的组
【发布时间】:2018-05-21 20:01:59
【问题描述】:

我知道有很多关于 pandas 的 groupby-filter 问题,但我已经解决了其中的一些问题,但它们没有我需要的东西。

无论如何,这就是我对数据框 df 所拥有的:

user1   user2  date         quantity
-----------------------------
Alice   Bob    2018-05-21   100
Alice   Bob    2018-05-19   20
Alice   Carol  2018-01-01   1000
Bob     Carol  2018-02-01   100

我想计算给定user1-user2 对的数量的函数(假设是某个函数func),仅限工作日

到目前为止,我拥有的是:

df['day'] = df['date'].dt.weekday
df.groupby(['user1','user2']).filter(lambda x: (x.day < 5).any() )

但我没有得到我期望的结果。显然,过滤器的作用是仅选择至少一个 day 条目小于 5 的那些对。不过,我需要的是对于一个特定的 user1-user2 对,day 列小于 5 的所有行。

【问题讨论】:

  • 先过滤再分组?
  • @YakymPirozhenko 我必须像这样进行几次计算——这只是一个演示案例。所以我想,比如说,在工作日、周末、工作日晚上等得到总和,但总是针对相同的 user1-user2 对。它也是一个相当大的数据集(>10GB),有几行和>1M user1-user2 对,所以如果我这样做,我会一遍又一遍地做几个 groupbys...

标签: python pandas filter pandas-groupby


【解决方案1】:

一个简单的解决方案是在执行groupby 之前过滤您的数据框:

res = df[df['date'].dt.weekday < 5].groupby(...)

【讨论】:

  • 谢谢!这有效(与 Yakym 之前的评论相同),但我唯一担心的是我正在处理一个大型数据集和几个这样的操作。多次分组的计算密集度如何(我有大约 100 万个 user1-user2 对)?还是这种重复的groupbys没什么大不了的?
  • 如果您想更改groupby 的范围,我看不出有一个简单的方法可以多次避免groupby。我会测试性能并如果有问题通过基准测试提出一个新问题来证明问题。
  • 知道了。谢谢!
猜你喜欢
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2015-02-13
  • 2023-01-10
相关资源
最近更新 更多