Py学习  »  Python

python:根据另一个数据帧的日期范围更新列的值

psangam • 6 年前 • 1767 次点击  

有2个数据帧 df events 如下所示:

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

任务是更新 东风 使用 事件 这样的话

如果 df.Place = events.Place df.Date 在范围内( events.Start_Date, events.End_Date ) df.Event 应该用相应的 event.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社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38962
文章 [ 1 ]  |  最新文章 6 年前
U10-Forward
Reply   •   1 楼
U10-Forward    7 年前

解决方案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)

在代码的末尾。

那么现在:

打印(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())))

在代码的末尾。

那么现在:

打印(df)

输出:

日期地点事件
0 2017-01-01大学节假日
1 2017-01-01住宅公共假日
2 2017-01-01医院公共假日
3 2017-01-02大学假期
4 2017-01-02住宅公共假日
5 2017-01-02医院公共假日