Pandas - 满足条件值时返回坐标和值

时间:2017-03-22 19:48:01

标签: python pandas numpy

我正在使用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相匹配的名称。

我仍在继续尝试和阅读文档,如果我自己解决问题,我会更新/关闭。谢谢。

1 个答案:

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