python - 如何根据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
有超过一百万个不同日期的观察结果。
解决方案
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
推荐阅读
- python - 使用 selenium 进行 Web 抓取,返回多个 Web 域
- android - DocumentsContract.copyDocument() 总是失败
- reactjs - React/Redux 如何将值从 redux 存储设置为组件的状态
- vb.net - 来自嵌套对象 VB.net 的列表框 DisplayMember
- amazon-web-services - 对 s3 存储桶中的 csv 数据进行分区,以便使用 Athena 进行查询
- maven - 执行 maven install 阶段而不执行 maven compile
- javascript - 有谁知道如何为对象 91 重新训练 TFJS 的对象检测(coco-ssd)?
- angular - Compodocs + Storybook + Angular 9中的空documentation.json
- python - 循环遍历文件对python
- openssl - OpenLDAP TLS 失败,TLS init def ctx failed: -69