连接两个 Dataframe df1和df2,其中df2中的日期应该是df1中日期之后的第一个日期,即df1中的日期之后的最早日期

k4ymrczo  于 2022-10-23  发布在  其他
关注(0)|答案(1)|浏览(124)

--问题陈述描述:-我有两个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 |氯化钠|
--请帮助我获得以下输出。任何帮助都将不胜感激。我们还可以使用任何循环,也可以定义任何自定义函数,或者如果需要,可以创建任何额外的列以获得所需的输出。

hmae6n7t

hmae6n7t1#

我无法得到完整的答案,但这可能会有所帮助:
pd.merge_asof实际上是在最近的日期时间合并。如果将DataFrame格式化为datetime64[ns]

df1["date_sold"] = pd.to_datetime(df1["date_sold"], format="%d-%m-%Y", exact=False)
df2["date_sold"] = pd.to_datetime(df2["date_sold"], format="%d-%m-%Y", exact=False)

你可以这样合并它们。

Out[32]: 
     date_buy  id_x  qty_buy  rolling_sum_qty_buy  date_sold  id_y  qty_sold  rolling_sum_qty_sold
0  2019-07-30     7        1                    1 2019-08-01   7.0       1.0                   1.0
1  2019-10-20     7        1                    2 2019-12-27   7.0       1.0                   3.0
2  2020-01-17     7        1                    3 2020-02-01   7.0       1.0                   4.0
3  2020-02-15     7        1                    4 2021-07-25   7.0       1.0                   6.0
4  2020-02-15     7        1                    5 2021-07-25   7.0       1.0                   6.0
5  2020-02-15     7        1                    6 2021-07-25   7.0       1.0                   6.0
6  2021-07-14     7        1                    7 2021-07-25   7.0       1.0                   6.0
7  2021-09-19     7        1                    8 2022-04-25   7.0       1.0                  11.0
8  2021-12-25     7        1                    9 2022-04-25   7.0       1.0                  11.0
9  2021-12-30     7        1                   10 2022-04-25   7.0       1.0                  11.0
10 2022-02-10     7        1                   11 2022-04-25   7.0       1.0                  11.0
11 2022-03-15     7        1                   12 2022-04-25   7.0       1.0                  11.0
12 2022-03-15     7        1                   13 2022-04-25   7.0       1.0                  11.0
13 2022-06-14     7        1                   14        NaT   NaN       NaN                   NaN

这将匹配每个buy和第一个sold。它可以跳过2019-09-15上的销售。但是根据定义,它将执行左连接,因此如果匹配多个元素,则只需重复元素。因此,它只给出6, 6, 6, 6而不是11, NaN, NaN, ...,它只重复11
希望这仍然有助于你走上正确的道路:)

相关问题