猿问

滚动浏览两个数据框并比较一列数据

我有以下数据帧:


      import pandas as pd

      import numpy as np


      df_Sensor = pd.DataFrame({'ID_System_Embed': ['1000', '1000', '1000', '1003', '1004'], 

                      'Date_Time': ['2020-10-18 12:58:05', '2020-10-18 12:58:15',

                                    '2020-10-19 20:10:10', '2018-12-18 12:58:00', 

                                    '2015-10-25 11:00:00']})




     df_Period = pd.DataFrame({'ID_System_Embed': ['1000', '1000', '1001', '1002', '1003', '1004'],

                      'ID_Sensor': ['1', '2', '3', '4', '5', '6'], 

                      'Date_Init': ['2020-10-18 12:58:00', '2020-10-18 19:58:00',

                                    '2019-11-18 19:58:00', '2018-12-29 12:58:00',

                                    '2019-11-20 12:58:00', '2015-10-25 10:00:00'],


                      'Date_End': ['2020-10-18 16:58:00', '2020-10-19 20:58:00',

                                   '2019-11-25 12:58:00', '2018-12-18 12:58:00',

                                   '2019-11-25 12:58:00', '2015-10-25 12:00:00']})

我需要检测数据帧“df_Sensor”的日期是否包含在同一ID_System_Embed(嵌入式系统的标识符)的第二个数据帧(df_Period)的日期范围内。


我试图实现以下代码:


      df_Period['New_Column'] = 0


     for j in range(0, len(df_Period)):

          for i in range(0, len(df_Sensor)):



              if((df_Sensor['ID_System_Embed'].iloc[i] == df_Period['ID_System_Embed'].iloc[j]) &

                 (df_Sensor['Date_Time'].iloc[i] >= df_Period['Date_Init'].iloc[j]) &

                 (df_Sensor['Date_Time'].iloc[i] <= df_Period['Date_End'].iloc[j])):


                   df_Period['New_Column'].iloc[j] += 1       

此代码正在合并并产生预期的输出。但是,它不是很有效,因为它需要在两个数据帧之间迭代(使用for)。我想发现一种更快,更有效的方法来进行操作并产生相同的输出。

郎朗坤
浏览 100回答 1
1回答

宝慕林4294392

按 ['ID_System_Embed','ID_Sensor'] 作为唯一键对df_Period和df_Sensor进行分组,然后使用 appnd 函数将其他日期列的值聚合为列表def appnd(col):&nbsp; &nbsp; return [d for d in col]df_p = df_Period.copy().groupby(['ID_System_Embed', 'ID_Sensor']).agg(appnd)df_s = df_Sensor.copy().groupby(['ID_System_Embed']).agg(appnd)然后联接两个数据帧(可以用 0 填充 NaN)df = df_p.join(df_s).fillna(value = 0)df['New_Column'] = 0df将此函数应用于将结果映射到New_Column的日期列def inInterval(row):&nbsp; &nbsp; ctr = 0&nbsp; &nbsp; for d in row[2]:&nbsp; &nbsp; &nbsp; &nbsp; for start, end in zip(row[0], row[1]):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&nbsp; start <= d <= end: ctr +=1&nbsp; &nbsp; return ctrdf['New_Column'] = df[ ['Date_Init', 'Date_End', 'Date_Time'] ].copy()\&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .apply(lambda x: inInterval(x)&nbsp; if type(x[2]) == list else 0, axis = 1)df
随时随地看视频慕课网APP

相关分类

Python
我要回答