【问题标题】:Finding the date range of a date in different dataframes在不同的数据框中查找日期的日期范围
【发布时间】:2022-02-16 14:43:36
【问题描述】:

我有三个数据框:

df_1 = 

     Name    Description           Date         Quant      Value 
 0   B100        text123     2021-01-02             3       89.1
 1   B101        text567     2021-01-03             2       90.1
 2   A200        text820     2021-03-02             1       90.2
 3   B101        text567     2021-03-02             6       90.2
 4   A500        text758     2021-03-06             1       94.0
 5   A500        text758     2021-03-06             2       94.0
 6   A500        text758     2021-03-07             2       94.0
 7   A200        text820     2021-04-02             1       90.2
 8   A999        text583     2021-05-05             2       90.6
 9   A998        text834     2021-05-09             1       99.9

df_2 = # the index is funny because I did some manipulations and dropped some NaNs before
       Code     Name     Person
  0    900      B100        600
  1    901      B100        610
  2    959      B101        670
  3    979      A999        670
  6    944      A200        388
  7    921      A500        663
  8    988      B300        794

df_3 =

     Code        StartDate       EndDate      RealValue
0     900       2000-01-01    2007-12-31           80.9
1     901       2008-01-01    2099-12-31           98.8
2     902       2000-01-01    2020-02-02           98.3
3     903       2000-01-01    2007-01-10           90.6
4     903       2007-01-11    2099-12-31           90.7
5     959       2020-04-09    2099-12-31           98.9
6     979       2000-01-01    2009-02-12           87.6
7     979       2009-02-13    2021-06-13           78.0
8     979       2021-06-15    2099-12-31           89.5
9     944       2020-04-09    2099-12-31           98.9
10    921       2020-04-09    2099-12-31           98.9

我想做以下事情:

df_1开始,在df_1中为每个Namedf_2中找到对应的Code(s)。现在我查看df_1 以查看每个DateValueQuant 是什么,并将ValueDate 所在日期范围内的每个RealValue 进行比较。困难的部分是选择正确的代码,然后选择正确的数据范围。所以:

Name         Date   Code     Value      RealValue     Quant
B100   2021-01-02    901      89.1           98.8         3
B101   2021-01-03    959      90.1           98.9         2
A200   2021-03-02    944      90.2           98.9         1
B101   2021-03-02    959      90.1           98.9         6
A500   2021-03-06    921      94.0           98.9         1
A500   2021-03-06    921      94.0           98.9         2
A500   2021-03-07    921      94.0           98.9         2
A200   2021-05-05    944      90.2           98.9         2
A999   2021-05-05    979      90.6           78.0         2

我所做的是将所有内容合并到一个表中,但由于我的真实数据集很大,而且有许多记录并没有出现在任何地方,我可能会丢失一些数据或最终得到 NaN。因此,我会将数据框保留在此处,并在它们中导航df_1 中的每条记录。这可能吗?

【问题讨论】:

    标签: python pandas dataframe datetime merge


    【解决方案1】:

    首先,将Name 列从df2 映射到df3,然后在Name 列上合并df1df3。最后,过滤掉Date 介于StartDateEndDate 之间的行:

    COLS = df1.columns.tolist() + ['RealValue']
    
    df3['Name'] = df3['Code'].map(df2.set_index('Code')['Name'])
    
    out = df1.merge(df3, on='Name', how='left') \
             .query('Date.between(StartDate, EndDate)')[COLS]
    

    输出:

    >>> out
        Name Description        Date  Quant  Value  RealValue
    1   B100     text123  2021-01-02      3   89.1       98.8
    2   B101     text567  2021-01-03      2   90.1       98.9
    3   A200     text820  2021-03-02      1   90.2       98.9
    4   B101     text567  2021-03-02      6   90.2       98.9
    5   A500     text758  2021-03-06      1   94.0       98.9
    6   A500     text758  2021-03-06      2   94.0       98.9
    7   A500     text758  2021-03-07      2   94.0       98.9
    8   A200     text820  2021-04-02      1   90.2       98.9
    10  A999     text583  2021-05-05      2   90.6       78.0
    

    【讨论】:

    • 我收到错误:TypeError: unhashable type: 'Series' 在最后一个代码行。可能是因为我的 df3 中可能有一些字符串,而 RealValue 列的类型是对象?
    • 所以当我打印第二行代码时,我有很多 NaN 作为“名称”,这可能是个问题吗?在我原始帖子的示例中,有一些名称仅出现在其中一个数据框中。
    • 首先,在 df3 中,您是否将 Name 视为新列?
    • 在原来的一个没有,在你输出的那个是,并且许多值是 NaN 但这应该不是问题......
    • 即使在 EndDate 中也有 NaN
    【解决方案2】:

    例子:

    start_date = "2019-1-1"
    end_date="2019-1-31"
    
    after_start_dates=df['date']>= start_date
    before_star_dates=df['date']<= end_date
    
    between_date=after_start_dates & before_end_dates
    filter_dates=df.loc[between_dates]
    
    print(filtered_dates)
    

    【讨论】:

      【解决方案3】:

      试试这个:

      try1 = pd.merge(df_1, df_2, on = 'Name', how = 'outer')
      try2 = pd.merge(try1, df_3, on = 'Code', how = 'outer')
      try2
      

      然后,您尝试在 try2 中导航。

      try2[['Name','Date','Code','Value','RealValue','Quant']]
      

      【讨论】:

        猜你喜欢
        • 2015-10-05
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 2013-08-17
        相关资源
        最近更新 更多