【问题标题】:Python Pandas: How to combine or merge two difrent size dataframes based on datesPython Pandas:如何根据日期组合或合并两个不同大小的数据框
【发布时间】:2021-10-02 11:08:21
【问题描述】:

我喜欢根据日期范围合并或组合两个不同大小的数据框 df1 和 df2,例如:

df1:

Date        Open  High  Low
2021-07-01  8.43  8.44  8.22 
2021-07-02  8.36  8.4   8.28
2021-07-06  8.22  8.23  8.06
2021-07-07  8.1   8.19  7.98
2021-07-08  8.07  8.1   7.91
2021-07-09  7.97  8.11  7.92
2021-07-12  8     8.2   8
2021-07-13  8.15  8.18  8.06
2021-07-14  8.18  8.27  8.12
2021-07-15  8.21  8.26  8.06
2021-07-16  8.12  8.23  8.07

df2:

Day of month   Revenue   Earnings
01             45000     4000
07             43500     5000
12             44350     6000
15             39050     7000

结果应该是这样的:

组合:

Date        Open  High  Low   Earnings
2021-07-01  8.43  8.44  8.22  4000
2021-07-02  8.36  8.4   8.28  4000
2021-07-06  8.22  8.23  8.06  4000
2021-07-07  8.1   8.19  7.98  5000
2021-07-08  8.07  8.1   7.91  5000
2021-07-09  7.97  8.11  7.92  5000
2021-07-12  8     8.2   8     6000
2021-07-13  8.15  8.18  8.06  6000
2021-07-14  8.18  8.27  8.12  6000
2021-07-15  8.21  8.26  8.06  7000
2021-07-16  8.12  8.23  8.07  7000

收入列是根据日期范围合并的,我如何在 python pandas 中做到这一点?

【问题讨论】:

  • df1和df2是否只包含一个月的数据?
  • 它还有更多,但我简化了它。

标签: python pandas dataframe merge


【解决方案1】:

试试merge_asof

#df1.date=pd.to_datetime(df1.date)
df1['Day of month'] = df1.Date.dt.day 
out = pd.merge_asof(df1, df2, on ='Day of month', direction = 'backward')
out
Out[213]: 
         Date  Open  High   Low  Day of month  Revenue  Earnings
0  2021-07-01  8.43  8.44  8.22           1    45000      4000
1  2021-07-02  8.36  8.40  8.28           2    45000      4000
2  2021-07-06  8.22  8.23  8.06           6    45000      4000
3  2021-07-07  8.10  8.19  7.98           7    43500      5000
4  2021-07-08  8.07  8.10  7.91           8    43500      5000
5  2021-07-09  7.97  8.11  7.92           9    43500      5000
6  2021-07-12  8.00  8.20  8.00          12    44350      6000
7  2021-07-13  8.15  8.18  8.06          13    44350      6000
8  2021-07-14  8.18  8.27  8.12          14    44350      6000
9  2021-07-15  8.21  8.26  8.06          15    39050      7000
10 2021-07-16  8.12  8.23  8.07          16    39050      7000

【讨论】:

  • 知道为什么下面会引发TypeError吗? pd.merge_asof(df1, df2, left_on=pd.to_datetime(df1['Date']).dt.day, right_on='Day of month')
  • @mozway 应该从原始 df 传递一个名称,而不是一个系列 ~
  • 好的,这种方法似乎适用于pd.merge
  • @mozway Yelp,希望他们可以在新版本中添加这个~
【解决方案2】:

更通用的方法如下:

  1. 首先您介绍两个数据框共享的密钥。 在这种情况下,月份的日期(或者,可能是多个键,如月份和月份的日期)。 df1["day"] = df1["Date"].dt.day
  2. 如果您现在要合并(在 df1 上左加入 df2),您将在 df2 中没有足够的键,因为缺少几天。为了填补空白,我们可以进行插值,或者使用简单的方法:如果我们不知道特定日期的收入/收入,我们会采用最后一个已知的,并且不再进行计算。此处描述了实现此目的的一种方法:How to replace NaNs by preceding or next values in pandas DataFrame?df.fillna(method='ffill')
  3. 现在我们合并我们的密钥。按照文档 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html ,我们这样做:df1.merge(df2, left_on='day')

瞧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2021-10-24
    • 2019-12-26
    • 2015-02-17
    相关资源
    最近更新 更多