【问题标题】:Pandas group by date range with multiple columnsPandas 按日期范围分组,多列
【发布时间】:2021-02-18 06:34:19
【问题描述】:

我有一个这样的数据框,

df
col1    col2          col3
 A      2021-02-01     P
 B      2021-02-12     P
 C      2021-02-08     Q
 A      2021-02-04     Q
 B      2021-02-14     Q
 A      2021-02-15     S

col2 是 pandas 日期时间类型。现在我想在 col1 和 col2 上对 col3 值进行分组(日期日期范围为 +- 4 天,例如:2021-02-01 和 2021-02-04 之间的 col3 值应根据 col1 值分组)

所以最终的数据框应该是这样的,

col1    col3
 A      [P,Q]
 B      [P,Q]
 C      [Q]
 A      [S]

这可以使用 for 循环并检查日期时间差异来完成,但执行时间会很长,因此请寻找 pandas 快捷方式来更有效地执行此操作。

【问题讨论】:

  • 有关于with date date range of +- 4 days的讨论,可以多解释一下吗?

标签: python pandas dataframe


【解决方案1】:

如果需要从组使用的第一天开始,每 4 天定义一次组:

首先创建帮助列,用于通过4 的整数除法每组的第一个值减去日期,然后将其用于聚合列表:

df['g'] = df['col2'].sub(df.groupby('col1')['col2'].transform('first')).dt.days // 4

df=df.groupby(['g','col1'])['col3'].agg(list).reset_index(level=0,drop=True).reset_index()
print (df)
  col1    col3
0    A  [P, Q]
1    B  [P, Q]
2    C     [Q]
3    A     [S]

【讨论】:

  • 我认为 //4 并不反映 OP 所说的 +-4days。此外,日期簇的边界可能更难定义
  • 巧妙地使用// 4 来定义范围。我今天一直很喜欢你的groupby 答案...
  • @BingWang - 是的,我使用 OP 示例 ex: col3 values between 2021-02-01 and 2021-02-04,所以按第一个值进行比较
  • 不应该是 1/31 和 2/3,或者 1/30 和 2/2 也应该在 4 天之内吗?我的意思是很难假设边界从 4 的倍数开始
  • @BingWang - 是的,如果需要+-4,那就更复杂了。
猜你喜欢
  • 2022-06-29
  • 2013-11-04
  • 2021-11-16
  • 1970-01-01
  • 2013-05-19
  • 2010-10-31
  • 2016-09-22
相关资源
最近更新 更多