根据另一个数据框的多个功能对数据框进行过滤

时间:2018-08-15 12:10:22

标签: python pandas dataframe filter

情况:
我有两个数据集:

  • df1:包含传感器数据,每分钟登录的机器ID
  • df2:包含生产单元ID,机器ID以及单元的开始和结束日期时间

df1:
enter image description here

df2:
enter image description here

我的任务是仅根据机器的生产时间范围进行过滤。这意味着基于df2中的生产日期时间(这些时间是df2中开始和停止之间的时间范围),我需要从df2中滤除泄漏传感器数据(传感器数据每分钟记录在df2中,无论是否有生产或不)。

问题:
我能够编写一个代码来过滤df2中的时间间隔,但是我也不知道如何过滤计算机ID。
这是我的工作代码,仅包含日期时间过滤:

for index, row in df1.iterrows():
    mask = ((df2.index >= row['Start']) & (df2.index <= row['Stop']))
    df2.loc[mask, 'Sarzs_no'] = row['Sarzs_no']
    df2.loc[mask, 'Output'] = row['Output']

这是我尝试在日期时间过滤中添加“单位”(=计算机ID)过滤的方法:

for index, row in df1.iterrows():
    mask = ((df1.index >= row['Start']) & (df1.index <= row['Stop']) & (row['Unit']==df1.Unit))
    df1.loc[mask, 'Sarzs_no'] = row['Sarzs_no']
    df1.loc[mask, 'Output'] = row['Output']

不幸的是,以上代码无法正常工作。

问题:

  1. 能不能让我知道我做错了什么?
  2. 能否让我知道如何在计算机ID(列“ Unit”)上添加过滤器参数?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想发表此评论,但我没有足够的声誉来做到这一点。初步提示:

1)尝试检查您的钥匙。第一个df中的单位与第二个df中的单位具有不同的模式。您可能需要转换一个或另一个。 例如循环之前:

df1["Unit"] = df1["Unit"].apply(lambda x: x.split('_')[1]) # K2_110 -> 110

2)在您的示例中,您遍历 first 数据框,并将掩码也应用于 first 数据框

df1.loc[mask, 'Sarzs_no'] = row['Sarzs_no']
df1.loc[mask, 'Output'] = row['Output']`