我正在处理的项目要求我找出自上次处理以来哪个“项目”已更新。为此,我有两个数据框,每个数据框都包含三列,最后一个是一个日期,该日期表示最后一次更新项目。第一个数据帧来自数据库表上的查询,该查询记录了“项目”的更新日期。第二个是元数据,大约是我上一次应用程序部分处理项目时,我将自己存储在另一个表中。
我想我走得很远,但是我遇到了以下错误,请参见下面提供的代码:
lastmatch = pd.DataFrame({
'projectid': ['1', '2', '2', '3'],
'stage': ['c', 'c', 'v', 'v'],
'lastmatchdate': ['2020-08-31', '2013-11-24', '2013-11-24',
'2020-08-31']
})
lastmatch['lastmatchdate'] = pd.to_datetime(lastmatch['lastmatchdate'])
processed = pd.DataFrame({
'projectid': ['1', '2'],
'stage': ['c', 'v'],
'process_date': ['2020-08-30', '2013-11-24']
})
processed['process_date'] = pd.to_datetime(
processed['process_date']
)
unprocessed = lastmatch[~lastmatch.isin(processed)].dropna()
processed.set_index(['projectid', 'stage'], inplace=True)
lastmatch.set_index(['projectid', 'stage'], inplace=True)
processed.sort_index(inplace=True)
lastmatch.sort_index(inplace=True)
print(lastmatch['lastmatchdate'])
print(processed['process_date'])
to_process = lastmatch.loc[lastmatch['lastmatchdate'] > processed['process_date']]
我要实现的结果是一个数据帧,其中包含“ lastmatchdate”大于上次处理项目的日期(process_date)的行。但是这一行:
to_process = lastmatch.loc[lastmatch['lastmatchdate'] > processed['process_date']]
产生一个ValueError: Can only compare identically-labeled Series objects
。我认为这可能是我不知道或弄错的语法。
在这种情况下,我期望的输出是
lastmatchdate
projectid stage
1 c 2020-08-31
具体来说,问题是:如何获得一个仅包含另一个数据帧的行的数据帧,该行的(datetime)值的a列大于另一个数据帧的b列。
答案 0 :(得分:1)
merged = pd.merge(processed, lastmatch, left_index = True, right_index = True)
merged = merged.assign(to_process = merged['lastmatchdate']> merged['process_date'])
您将获得以下信息:
process_date lastmatchdate to_process
projectid stage
1 c 2020-08-31 2020-08-31 False
2 v 2013-11-24 2013-11-24 False
答案 1 :(得分:1)
您已经收到ValueError
,因为您尝试比较两个不同的数据帧,如果要逐行比较两个数据帧,请在合并之前将它们合并
lastmatch = pd.DataFrame({
'projectid': ['1', '2', '2', '3'],
'stage': ['c', 'c', 'v', 'v'],
'lastmatchdate': ['2020-08-31', '2013-11-24', '2013-11-24',
'2020-08-31']
})
lastmatch['lastmatchdate'] = pd.to_datetime(lastmatch['lastmatchdate'])
processed = pd.DataFrame({
'projectid': ['1', '2'],
'stage': ['c', 'v'],
'process_date': ['2020-08-30', '2013-11-24']
})
processed['process_date'] = pd.to_datetime(
processed['process_date']
)
df=pd.merge(lastmatch,processed,on=['stage','projectid'])
df=df[
df.lastmatchdate>df.process_date
]
print(df)
projectid stage lastmatchdate process_date
0 1 c 2020-08-31 2020-08-30