--问题陈述描述:-我有两个df-df1和df2。df1包含id=7的购买数量数据,df2包含id=8的销售数量数据。df1和df2都根据日期排序,即从最早到最晚的日期,每次只购买或销售1个数量。
--数据流1
|日期购买|id |数量购买|rolling_sum_qty_buy|
| ------------ | ------------ | ------------ | ------------ |
| 30-07-2019 | 7 | 1 | 1 |
| 20-10-2019 | 7 | 1 | 2 |
| 17-01-2020 | 7 | 1 | 3 |
| 15-02-2020 | 7 | 1 | 4 |
| 15-02-2020 | 7 | 1 | 5 |
| 15-02-2020 | 7 | 1 | 6 |
| 14-07-2021 | 7 | 1 | 7 |
| 19-09-2021 | 7 | 1 | 8 |
| 25-12-2021 | 7 | 1 | 9 |
| 30-12-2021 | 7 | 1 | 10 |
| 10-02-2022 | 7 | 1 | 11 |
| 15-03-2022 | 7 | 1 | 12 |
| 15-03-2022 | 7 | 1 | 13 |
| 14-06-2022 | 7 | 1 | 14 |
--数据流2
|date_sold|id|qty_selld|rolling_sum_qty_saled|
| ------------ | ------------ | ------------ | ------------ |
| 01-08-2019 | 7 | 1 | 1 |
| 15-09-2019 | 7 | 1 | 2 |
| 27-12-2019 | 7 | 1 | 3 |
| 01-02-2020 | 7 | 1 | 4 |
| 12-02-2020 | 7 | 1 | 5 |
| 25-07-2021 | 7 | 1 | 6 |
| 25-07-2021 | 7 | 1 | 7 |
| 28-08-2021 | 7 | 1 | 8 |
| 10-09-2021 | 7 | 1 | 9 |
| 12-09-2021 | 7 | 1 | 10 |
| 25-04-2022 | 7 | 1 | 11 |
--我想要什么现在,我想在两个条件下连接这两个 Dataframe df1和df2
1.对于df1中的每一个日期(即date_buy列),我应该得到输出,其中date(即date_sold)大于date_buy,并且我想要第一个日期(如date_soldd)大于该特定日期(即日期_buy)。
1.我还希望在我的输出中没有与df2连接的df1中的那些行,这样我可以很容易地找到剩余的数量,因为在df1中,我有数量购买,在与df2结合之后,我将获得数量出售,因此在我得到空值的情况下,在这种情况下,我可以假设剩余的数量是那么多。
--我的输出:-早些时候,当没有datecondition时,我只是使用左连接,即在滚动和条件下合并df以连接df1和df2,而在有空情况下,我使用数量的和来获得剩余数量,但现在我也有那个日期条件,所以我不能在连接条件中直接使用rollingsum_cond列。
--代码“”df3=df1.merge(df2,how=“left”,left_on=[“rolling_sum_qty_buy”],right_on=['rolling_sum_qty_selld”])“”
--我在没有使用任何日期条件的情况下获得的输出
|日期购买|id |数量购买|rolling_sum_qty_buy |日期销售|id-2 |数量销售|rollingsum_qty销售|
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
| 30-07-2019 | 7 | 1 | 1 | 01-08-2019 | 7 | 1 | 1 |
| 20-10-2019 | 7 | 1 | 2 | 15-09-2019 | 7 | 1 | 2 |
| 17-01-2020 | 7 | 1 | 3 | 27-12-2019 | 7 | 1 | 3 |
| 15-02-2020 | 7 | 1 | 4 | 01-02-2020 | 7 | 1 | 4 |
| 15-02-2020 | 7 | 1 | 5 | 12-02-2020 | 7 | 1 | 5 |
| 15-02-2020 | 7 | 1 | 6 | 25-07-2021 | 7 | 1 | 6 |
| 14-07-2021 | 7 | 1 | 7 | 25-07-2021 | 7 | 1 | 7 |
| 19-09-2021 | 7 | 1 | 8 | 28-08-2021 | 7 | 1 | 8 |
| 25-12-2021 | 7 | 1 | 9 | 10-09-2021 | 7 | 1 | 9 |
| 30-12-2021 | 7 | 1 | 10 | 12-09-2021 | 7 | 1 | 10 |
| 10-02-2022 | 7 | 1 | 11 | 25-04-2022 | 7 | 1 | 11 |
|2022年3月15日| 7日| 1日| 12日|南|南|南|南|
|2022年3月15日| 7日| 1日| 13日|南|南|南|南|
|14-06-2022 | 7 | 1 | 14 |南|南|南|南||
--**现在我还必须使用date条件来获得所需的输出
--预期产出
|date_buy|id|qty_buy| rolling_sum_qty_busy| date_sold|id| qty_selld| rolling.sum_qty_saled|
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
| 30-07-2019 | 7 | 1 | 1 | 01-08-2019 | 7 | 1 | 1 |
| 20-10-2019 | 7 | 1 | 2 | 27-12-2019 | 7 | 1 | 3 |
| 17-01-2020 | 7 | 1 | 3 | 01-02-2020 | 7 | 1 | 4 |
| 15-02-2020 | 7 | 1 | 4 | 25-07-2021 | 7 | 1 | 6 |
| 15-02-2020 | 7 | 1 | 5 | 25-07-2021 | 7 | 1 | 7 |
| 15-02-2020 | 7 | 1 | 6 | 28-08-2021 | 7 | 1 | 8 |
| 14-07-2021 | 7 | 1 | 7 | 10-09-2021 | 7 | 1 | 9 |
| 19-09-2021 | 7 | 1 | 8 | 25-04-2022 | 7 | 1 | 11 |
|25-12-2021 | 7 124|1 124 9 124;楠124)楠|
|30-12-2021 | 7 124|1 124 10 124;楠124)楠|
|2022年2月10日| 7日| 1日| 11日|氯化钠|氯化钠|NaN |氯化钠|
|2022年3月15日| 7日| 1日| 12日|氯化钠|氯化钠|NaN |氯化钠|
|2022年3月15日| 7日| 1日| 13日|氯化钠|氯化钠|NaN |氯化钠|
|14-06-2022 | 7 | 1 | 14 |氯化钠|氯化钠|NaN |氯化钠|
--请帮助我获得以下输出。任何帮助都将不胜感激。我们还可以使用任何循环,也可以定义任何自定义函数,或者如果需要,可以创建任何额外的列以获得所需的输出。
1条答案
按热度按时间hmae6n7t1#
我无法得到完整的答案,但这可能会有所帮助:
pd.merge_asof
实际上是在最近的日期时间合并。如果将DataFrame
格式化为datetime64[ns]
你可以这样合并它们。
这将匹配每个
buy
和第一个sold
。它可以跳过2019-09-15
上的销售。但是根据定义,它将执行左连接,因此如果匹配多个元素,则只需重复元素。因此,它只给出6, 6, 6, 6
而不是11, NaN, NaN, ...
,它只重复11
。希望这仍然有助于你走上正确的道路:)