【问题标题】:Python : Update Values of a Column based on Date Range from another Data FramePython:根据来自另一个数据框的日期范围更新列的值
【发布时间】:2019-03-06 02:50:45
【问题描述】:

有 2 个数据框 dfevents 如下所示:

import pandas as pd

df = pd.DataFrame({'Place':['university','residential','hospital','university','residential','hospital'],
                   'Date':['2017-01-01','2017-01-01','2017-01-01','2017-01-02','2017-01-02','2017-01-02'],
                   'Event':['None','None','None','None','None','None']
                })
events = pd.DataFrame({'Place':['university','residential','hospital'], 'Start_Date':['2017-01-01','2017-01-01','2017-01-01'],
                                      'End_Date':['2017-02-26','2017-01-02','2017-01-02'],
                                       'Event':['UniHolidays','PublicHoliday','PublicHoliday']})

#Convert to datetime
events.Start_Date = pd.to_datetime(events.Start_Date.astype(str), format='%Y-%m-%d')
events.End_Date = pd.to_datetime(events.End_Date.astype(str), format='%Y-%m-%d')
df.Date = pd.to_datetime(df.Date.astype(str), format='%Y-%m-%d')

df 在 2017 年每个地方的每个日期都有 1 条记录

df:
    Date         Place            Event
    2017-01-01   university        None
    2017-01-01   residential       None
    2017-01-01   hospital          None
    2017-01-02   university        None
    2017-01-02   residential       None
    2017-01-02   hospital          None

第二个数据框包含这些地点的事件,但有一个日期范围

events:

Place     Start_Date     End_Date   Event
a      2017-01-01      2017-02-26   UniHoliday
b      2017-01-01      2017-01-02   PublicHoliday
c      2017-01-01      2017-01-02   PublicHoliday

任务是使用events 更新df,以便

如果 df.Place = events.Placedf.Date 在范围内 (events.Start_Date, events.End_Date),则应使用相应的 event.Event 更新 df.Event

预期的输出是:

Date        Place                Event
    2017-01-01  university       UniHoliday
    2017-01-01  residential      PublicHoliday
    2017-01-01  hospital         PublicHoliday
    2017-01-02  university       UniHoliday
    2017-01-02  residential      PublicHoliday
    2017-01-02  hospital         PublicHoliday

没有重叠的事件,每个地方都有唯一的事件记录

到目前为止,我一直在思考: Populate column in data frame based on a range found in another dataframe ,但我无法理解它。任何帮助表示赞赏。谢谢!

【问题讨论】:

    标签: python pandas date dataframe


    【解决方案1】:

    解决方案 1:

    添加:

    df['Event']=events['Event'].tolist()*2
    

    到代码末尾。

    那么现在:

    print(df)
    

    是:

            Date          Event        Place
    0 2017-01-01    UniHolidays   university
    1 2017-01-01  PublicHoliday  residential
    2 2017-01-01  PublicHoliday     hospital
    3 2017-01-02    UniHolidays   university
    4 2017-01-02  PublicHoliday  residential
    5 2017-01-02  PublicHoliday     hospital
    

    ----------------------------------------

    解决方案 2:

    如果希望他们添加到正确的位置:

    df=df.drop('Event',1)
    df.insert(2,'Event',events['Event'].tolist()*2)
    

    在代码的最后。

    那么现在:

    print(df)
    

    输出:

            Date        Place          Event
    0 2017-01-01   university    UniHolidays
    1 2017-01-01  residential  PublicHoliday
    2 2017-01-01     hospital  PublicHoliday
    3 2017-01-02   university    UniHolidays
    4 2017-01-02  residential  PublicHoliday
    5 2017-01-02     hospital  PublicHoliday
    

    ---------------------------------------------- ----------------

    解决方案 1 + 解决方案 2,将起作用,

    但最好还是单独做。

    更新:

    用途:

    df=df.drop('Event',1)
    df.insert(2,'Event',events['Event'].tolist()*(len(df['Event'])/len(events['Event'].tolist())))
    

    在代码的最后。

    那么现在:

    print(df)
    

    输出:

            Date        Place          Event
    0 2017-01-01   university    UniHolidays
    1 2017-01-01  residential  PublicHoliday
    2 2017-01-01     hospital  PublicHoliday
    3 2017-01-02   university    UniHolidays
    4 2017-01-02  residential  PublicHoliday
    5 2017-01-02     hospital  PublicHoliday
    

    【讨论】:

    • 感谢您的解决方案。虽然它适用于此处的示例数据,但不适用于我的原始数据。我收到错误“值的长度与索引的长度不匹配”。另外,我不明白如何使用“事件”数据框中的日期范围来识别 df 中相应位置的相应事件。 df['Event']=events['Event'].tolist()*2 是做什么的?
    • @psangam 好的,因为我只是乘以 2,所以每次都要做更多的事情,我会快速编辑
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多