亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

滾動瀏覽兩個數據框并比較一列數據

滾動瀏覽兩個數據框并比較一列數據

郎朗坤 2022-09-20 17:18:32
我有以下數據幀:      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)。我想發現一種更快,更有效的方法來進行操作并產生相同的輸出。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

按 ['ID_System_Embed','ID_Sensor'] 作為唯一鍵

對df_Period和df_Sensor進行分組,然后使用 appnd 函數將其他日期列的值聚合為列表


def appnd(col):

    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'] = 0

df

http://img1.sycdn.imooc.com//6329858d0001a31910760362.jpg

將此函數應用于將結果映射到New_Column的日期列


def inInterval(row):

    ctr = 0

    for d in row[2]:

        for start, end in zip(row[0], row[1]):

            if  start <= d <= end: ctr +=1

    return ctr


df['New_Column'] = df[ ['Date_Init', 'Date_End', 'Date_Time'] ].copy()\

                    .apply(lambda x: inInterval(x)  if type(x[2]) == list else 0, axis = 1)

df

http://img1.sycdn.imooc.com//6329859a000161d010480346.jpg

查看完整回答
反對 回復 2022-09-20
  • 1 回答
  • 0 關注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號