pandas 根据给定的 plus/minus 日期 spread/range 分组匹配列的绝对值
pandas groupby a given plus/minus date spread/range on matching absolute values of a column
我已经尝试 select 我正在使用的数据类型的示例片段:
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
但我不确定它是否是一个足够强大的解决方案,如果有意义的话,我想更好地了解如何控制范围的宽度。据我所知,这些解决方案可能是适用于我当前切片的拙劣技巧。
感谢您的宝贵时间。
希望我正确理解了你的问题。
您在转换中按绝对值和 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() 没有配对差异。
我已经尝试 select 我正在使用的数据类型的示例片段:
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
但我不确定它是否是一个足够强大的解决方案,如果有意义的话,我想更好地了解如何控制范围的宽度。据我所知,这些解决方案可能是适用于我当前切片的拙劣技巧。
感谢您的宝贵时间。
希望我正确理解了你的问题。
您在转换中按绝对值和 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() 没有配对差异。