根据条件合并日期范围内日期的两个数据框

Rat*_*rit 6 python pandas

我的日历数据框如下。

calendar = pd.DataFrame({"events": ["e1", "e2", "e3"],
                         "date_start": ["2021-02-01", "2021-02-06", "2021-02-03"],
                         "date_end":["2021-02-04", "2021-02-07", "2021-02-03"],
                         "country": ["us", "us", "uk"]})
calendar["date_start"] = pd.to_datetime(calendar["date_start"])
calendar["date_end"] = pd.to_datetime(calendar["date_end"])
Run Code Online (Sandbox Code Playgroud)

我有一个每日数据框,如下所示。

daily = pd.DataFrame({"date": pd.date_range(start="2021-02-01", end="2021-02-08"),
                      "value":[10, 20, 30, 40, 50, 60, 70, 80]})
Run Code Online (Sandbox Code Playgroud)

我只想获取来自美国的事件并加入每日数据框,但加入条件是(日期 >= date_start)和(日期 <= date_end)。所以预期的输出看起来像这样

date              value   events
2021-02-01        10      e1
2021-02-02        20      e1
2021-02-03        30      e1
2021-02-04        40      e1
2021-02-05        50
2021-02-06        60      e2
2021-02-07        70      e2
2021-02-08        80
Run Code Online (Sandbox Code Playgroud)

我可以做循环,但效果不佳。我可以请您提出如何以更好的方式去做的建议吗?

May*_*wal 5

使用df.merge

# Do a cross-join on the `tmp` column
In [2279]: x = calendar.assign(tmp=1).merge(daily.assign(tmp=1))

# Filter rows by providing your conditions
In [2284]: x = x[x.date.between(x.date_start, x.date_end) & x.country.eq('us')]

# Left-join with `daily` df to get all rows
In [2289]: ans = daily.merge(x[['date', 'events']], on='date', how='left')

In [2290]: ans
Out[2290]: 
        date  value events
0 2021-02-01     10     e1
1 2021-02-02     20     e1
2 2021-02-03     30     e1
3 2021-02-04     40     e1
4 2021-02-05     50    NaN
5 2021-02-06     60     e2
6 2021-02-07     70     e2
7 2021-02-08     80    NaN
Run Code Online (Sandbox Code Playgroud)