我正在使用pandas和python 2.7.13并且我一直在尝试通过pandas导入excel文件并使用指定条件比较来自两个独立数据帧的数据,以查找DF2中的值何时落在DF1中的两个时间值之间,并且如果满足条件,则将DF1中的值返回到DF2。
数据集由DF2组成一个大型记录数据库,其中包含DateX(MM / DD / YYYY HH:MM,而DF1是人员工时的导出,其格式为开始时间和结束时间,两者的格式与工作人员相同我们使用第三方系统进行人员配置,它与我们的数据库和我正在编制的报告无关,我们需要了解具体员工如何影响绩效。
示例数据:
DF1
Employee: Start Time: End Time:
John Smith 1/1/2017 06:30 1/1/2017 18:30
Jane Smith 1/1/2017 06:30 1/1/2017 18:30
Tommy Boy 1/2/2017 06:30 1/2/2017 15:00
DF2
DateX:
1/1/2017 12:16
1/1/2017 06:43
1/2/2017 19:32
我对python有一些经验,但这是我第一次使用Pandas和numpy,我的经验纯粹基于我尝试过的项目。我目前的代码为:
import pandas as pd
file = 'sample set.xlsx'
xl = pd.ExcelFile(file)
df1 = xl.parse('Sheet1')
df2 = xl.parse('Sheet2')
for i in df2['DateX']:
if any(i >= df1['Start Time.1']) and any(i <= df1['End Time.1']):
print i
我目前只是试图打印我以确保我正在使用有限的数据集作为测试场。我遇到两个问题。 DF1可以有多个工作人员从DF2开始使用DateX,但如果有一个匹配则停止。
另一项是我接受了这个并尝试了解如何从df1 [&#39;员工&#39;]打印出来的比赛,但我的努力只产生了整个员工专栏。这是我学习的一步,试图让它在DF2上添加与datex相匹配的名称。
我仍在继续尝试和阅读文档,如果我自己解决问题,我会更新/关闭。谢谢。
答案 0 :(得分:0)
我的回答与@ Jay相似,但每次都会返回一份员工名单。不幸的是,Pandas不支持像SQL那样的条件连接。有一个新函数merge_asof
但它只为每行返回一个不适合你的值。
以下内容可行,但速度很慢。
dfs = []
for i, row in df1.iterrows():
criteria = (row['Start Time'] <= df2['DateX']) & (df2['DateX'] <= row['End Time'])
if not criteria.all():
dfs.append(df2[criteria].assign(Employee=row['Employee']))
df2_all = pd.concat(dfs)
df2_agg = df2_all.groupby('DateX').agg(lambda x: ' | '.join(x.tolist()))
df2_final = df2_agg.reindex(df2.DateX)
Employee
DateX
2017-01-01 06:43:00 [John Smith, Jane Smith]
2017-01-01 12:16:00 [John Smith, Jane Smith]
2017-01-02 19:32:00 NaN