首页 > 解决方案 > 如何根据df1中的日期> = df2中的日期加入两个熊猫数据框

问题描述

我有一个包含关键 ID、状态、开始日期和其他特征的大型数据框。我有另一个数据框,其中包含状态、开始日期和表示标志的“1”。

我想加入两者,基于状态和 df1 中的日期大于或等于 df2 中的日期。

举个例子。 df1是状态表、开始日期和标志的 1。 df2是一个需要这些标志if的数据框 df2 中>=的日期是df1. 最终结果是df3。唯一的观察得到状态匹配的标志和日期是>=原始日期。

import pandas as pd

dict1 = {'date':['2020-01-01', '2020-02-15', '2020-02-04','2020-03-17',
                 '2020-06-15'],
         'state':['AL','FL','MD','NC','SC'],
         'flag': [1,1,1,1,1]}
df1 = pd.DataFrame(dict1)
df1['date'] = pd.to_datetime(df1['date'])

dict2 = {'state': ['AL','FL','MD','NC','SC'],
         'keyid': ['001','002','003','004','005'],
         'start_date':['2020-02-01', '2020-01-15', '2020-01-30','2020-05-18',
                       '2020-05-16']}
df2 = pd.DataFrame(dict2)
df2['start_date'] = pd.to_datetime(df2['start_date'])

df3 = df2
df3['flag'] = [0,1,1,0,1]

如何以编程方式进入 df3?我的实际df1每个州都有一行。我的实际df2有超过一百万个不同日期的观察结果。

标签: pythonpandasjoin

解决方案


使用df.mergenumpy.where

In [29]: import numpy as np

In [30]: df3 = df2.merge(df1)[['state', 'keyid', 'start_date', 'date']]

In [31]: df3['flag'] = np.where(df3['start_date'].ge(df3['date']), 0, 1)

In [33]: df3.drop('date', 1, inplace=True)

In [34]: df3
Out[34]: 
  state keyid start_date  flag
0    AL   001 2020-02-01     0
1    FL   002 2020-01-15     1
2    MD   003 2020-01-30     1
3    NC   004 2020-05-18     0
4    SC   005 2020-05-16     1

推荐阅读