【问题标题】:pandas groupby a given plus/minus date spread/range on matching absolute values of a columnpandas groupby 给定的加/减日期分布/范围匹配列的绝对值
【发布时间】:2022-01-14 08:35:11
【问题描述】:

我已尝试选择我正在使用的数据类型的示例切片:

df = pd.DataFrame({'date' : pd.to_datetime(['2014-10-02', '2014-10-02', '2014-10-02', '2014-10-02', '2014-11-30', '2014-11-30', '2015-04-02', '2015-04-02', '2015-04-03', '2015-04-03', '2015-04-20', '2015-04-20', '2015-07-05', '2015-07-05', '2021-06-12', '2021-06-14', '2021-06-15', '2021-06-18', '2021-07-06', '2021-07-06', '2021-07-20', '2021-07-20', '2021-07-26', '2021-08-19', '2021-08-20', '2021-12-14', '2021-12-15']),
                   'amount' : [-1111.11, -1000.0, 1111.11, 1000.0, -1000.0, 1000.0, -193.36, 193.36, -813.02, 813.02, -250.0, 250.0, -100.0, 100.0, 20.0, -4643.53, 4643.53, 20.0, -4762.65, 4762.65, -3729.61, 3729.61, 32.0, -1075.99, 1075.99, -1033.94, 1033.94]})
      date   amount
2014-10-02 -1111.11
2014-10-02 -1000.00
2014-10-02  1111.11
2014-10-02  1000.00
2014-11-30 -1000.00
2014-11-30  1000.00
2015-04-02  -193.36
2015-04-02   193.36
2015-04-03  -813.02
2015-04-03   813.02
2015-04-20  -250.00
2015-04-20   250.00
2015-07-05  -100.00
2015-07-05   100.00
2021-06-12    20.00
2021-06-14 -4643.53
2021-06-15  4643.53
2021-06-18    20.00
2021-07-06 -4762.65
2021-07-06  4762.65
2021-07-20 -3729.61
2021-07-20  3729.61
2021-07-26    32.00
2021-08-19 -1075.99
2021-08-20  1075.99
2021-12-14 -1033.94
2021-12-15  1033.94

上述数据框中有许多正负值对,它们的时间间隔在 1-2 天内。我想忽略彼此相隔 1-2 天内的任何配对,并隔离非配对的日期金额。

我已经尝试了几次,但我似乎无法弄清楚如何最好地定义一个 1-2 天的范围来对日期进行分组,但已经取得了一些成功:

g = df.groupby([pd.Grouper(key='date', freq='5D'), df.amount.abs()])
g.size()

date        amount 
2014-10-02  1000.00    2
            1111.11    2
2014-11-26  1000.00    2
2015-03-31  193.36     2
            813.02     2
2015-04-20  250.00     2
2015-07-04  100.00     2
2021-06-12  20.00      1
            4643.53    2
2021-06-17  20.00      1
2021-07-02  4762.65    2
2021-07-17  3729.61    2
2021-07-22  32.00      1
2021-08-16  1075.99    2
2021-12-14  1033.94    2

虽然我不清楚为什么需要这么多天,但似乎没有特定的偏移量,它从第一个日期开始就将它们组合在一起。

到目前为止我最好的解决方案是:

g = df.groupby([df.date.dt.floor('3D'), df.amount.abs()])
g.size()

date        amount 
2014-10-01  1000.00    2
            1111.11    2
2014-11-30  1000.00    2
2015-04-02  193.36     2
            813.02     2
2015-04-20  250.00     2
2015-07-04  100.00     2
2021-06-11  20.00      1
2021-06-14  4643.53    2
2021-06-17  20.00      1
2021-07-05  4762.65    2
2021-07-20  3729.61    2
2021-07-26  32.00      1
2021-08-19  1075.99    2
2021-12-14  1033.94    2

但我不确定它是否是一个足够强大的解决方案,如果有意义的话,我想更好地了解如何控制范围的宽度。据我所知,这些解决方案可能是适用于我当前切片的糟糕技巧。

感谢您的宝贵时间。

【问题讨论】:

  • 忽略是什么意思?你想放弃它们吗?
  • 当你按日期频率分组时,会有固定的间隔。
  • @Vishnudev,不要放弃配对的本身,而只是隔离未配对的。在给出的示例中类似于g.size()[g.size() < 2].any()

标签: python pandas date pandas-groupby python-datetime


【解决方案1】:

希望我正确理解了您的问题。

你 groupby 绝对值和变换中的 diff()。 diff() 是当前和上一个之间的差异:

df["time_diff"] = df.groupby([df.amount.abs()])["date"].transform(lambda x: x.diff())

这假设行按日期排序,它们看起来是这样。

df["time_diff"] = df["time_diff"].dt.days

df["abs_amount"] = df["amount"].abs()
df = df.sort_values(by= ["abs_amount", "date"])
df["drop"] = df["time_diff"].lt(3) | df["time_diff"].shift(-1).lt(3)

现在,对于与具有相同值的条目相差不到 3 天的所有条目,下拉列设置为 True。

我们需要先按 abs_value 排序,以免造成混乱。我们使用 shift(-1) 是因为 diff() 没有配对差异。

【讨论】:

  • 不错的一个!感谢您的解释,我在全套设备上进行了测试,它似乎运行良好且易于更改天数,干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2014-02-21
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多