我需要一些帮助来做一些复杂的查找和丰富。我需要在Python 3.5中使用它
以下是该方案。我有2个数据帧:dfMaster和dfLookup
dfMaster包含fromDate,toDate,fromLocation,toLocation,LookupKey等列 (此数据框每天都会获得额外的行) dfMaster中的数据有两行:
2018年5月1日,即2018年5月3日,阿姆斯特丹,鹿特丹,NaN
2018年5月2日,即2018年5月5日,阿姆斯特丹,鹿特丹,NaN
dfLookup包含lookupDate,lookupFromLocation,lookupToLocation,someKey列 (这是一个相当静态的数据帧) dfLookup中的数据有2行:
2018年5月3日,阿姆斯特丹鹿特丹,Key1
2018年5月5日,阿姆斯特丹鹿特丹,Key1
我想在dfMaster上进行以下匹配:
如果所有这些匹配,我想选择dfLookup.Key1并将其放入dfMaster.LookupKey
最终输出应如下所示: 2018年5月1日,即2018年5月3日,阿姆斯特丹,鹿特丹,NaN
2018年5月2日,即2018年5月5日,阿姆斯特丹鹿特丹,Key1
没有找到一种简单的方法来做到这一点。我还希望最终输出不仅仅通过我丰富的内容进行过滤,而且还要通过那些未丰富的行进行过滤
由于
答案 0 :(得分:0)
import pandas as pd
from pandas import Timestamp
from numpy import nan
import numpy as np
# Data cleaning
dfLookup = pd.DataFrame({'lookupDate': {0: Timestamp('2018-03-05 00:00:00'),
1: Timestamp('2018-05-05 00:00:00')},
'lookupFromLocation': {0: 'Rotterdam', 1: 'Rotterdam'},
'lookupToLocation': {0: 'Amsterdam', 1: 'Amsterdam'},
'someKey': {0: 'Key1', 1: 'Key1'}}
)
dfMaster = pd.DataFrame({'fromDate': {0: Timestamp('2018-01-05 00:00:00'),
1: Timestamp('2018-02-05 00:00:00')},
'toDate': {0: Timestamp('2018-05-03 00:00:00'),
1: Timestamp('2018-05-05 00:00:00')},
'fromLocation': {0: 'Amsterdam', 1: 'Rotterdam'},
'toLocation': {0: 'Rotterdam', 1: 'Amsterdam'},
'LookupKey': {0: nan, 1: nan}}
)
# More data cleaning
dfLookup.lookupDate = pd.to_datetime(dfLookup.lookupDate)
dfMaster.fromDate = pd.to_datetime(dfMaster.fromDate)
dfMaster.toDate = pd.to_datetime(dfMaster.toDate)
pd.merge
使用两个数据框中的城市列
df = pd.merge(dfMaster, dfLookup, how='left', right_on=['lookupFromLocation', 'lookupToLocation'], left_on=['fromLocation', 'toLocation'])
# Check the date is in between the desired dates
df.LookupKey = df.LookupKey.mask(df.lookupDate.between(df.fromDate, df.toDate), df.someKey)
# Remove duplicates
df = df[dfMaster.columns].drop_duplicates()
Out[]:
fromDate toDate fromLocation toLocation LookupKey
0 2018-01-05 2018-05-03 Amsterdam Rotterdam NaN
1 2018-02-05 2018-05-05 Rotterdam Amsterdam Key1