根据条件,使用来自另一个数据的数据丰富一个数据帧

时间:2018-06-15 13:15:01

标签: python python-3.x pandas

我需要一些帮助来做一些复杂的查找和丰富。我需要在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.lookupDate并检查它们之间 dfMaster.fromDate和dfMaster.toDate
  • 接下来,我想检查lookupFromLocation匹配fromLocation
  • 最后,我想检查lookupToLocation是否匹配toLocation

如果所有这些匹配,我想选择dfLookup.Key1并将其放入dfMaster.LookupKey

最终输出应如下所示: 2018年5月1日,即2018年5月3日,阿姆斯特丹,鹿特丹,NaN

2018年5月2日,即2018年5月5日,阿姆斯特丹鹿特丹,Key1

没有找到一种简单的方法来做到这一点。我还希望最终输出不仅仅通过我丰富的内容进行过滤,而且还要通过那些未丰富的行进行过滤

由于

1 个答案:

答案 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