首页 > 解决方案 > 使用 pandas 将两个 dfs 的参数转移到一个新的

问题描述

我有两个数据框,它们都引用相同的事件(用 标记id)。一个 df 是离散的,并以特定分辨率显示事件在几个月内的进程(df1 仅显示摘录),另一个汇总每个事件的参数(df_event)。

简化数据:df(原始 df 有更多行!)

df = pd.DataFrame({'id':[1,1,1,2,2,2,2],
               'date':['2020-01-01 12:00:00','2020-01-01 12:00:00','2020-01-01 12:00:00','2020-01-05 15:00:00','2020-01-05 15:00:00',
                      '2020-01-05 15:00:00','2020-01-05 15:00:00'],
               'numb':[1,5,8,0,4,11,25]},
             index=pd.date_range(start = "2020-01-01 12:00", periods = 7, freq = '1H'))

df['date'] = pd.to_datetime(df['date'])

输出:

                    id                 date numb
2020-01-01 12:00:00 1   2020-01-01 12:00:00 1
2020-01-01 13:00:00 1   2020-01-01 12:00:00 5
2020-01-01 14:00:00 1   2020-01-01 12:00:00 8
2020-01-01 15:00:00 2   2020-01-05 15:00:00 0
2020-01-01 16:00:00 2   2020-01-05 15:00:00 4
2020-01-01 17:00:00 2   2020-01-05 15:00:00 11
2020-01-01 18:00:00 2   2020-01-05 15:00:00 25

df_event:

df_event = pd.DataFrame({'id':[1,2,3,4,5],
                         'date':['2020-01-01 12:00:00','2020-01-01 15:00:00','2020-01-08 07:00:00','2020-01-15 13:00:00','2020-01-22 12:00:00'],
                         'numb_total':[8,25,11,14,8],
                         'timedelta': [55,60,45,15,30]})

df_event = df_event.set_index('id')
df_event['date'] = pd.to_datetime(df_event['date'])
df_event['timedelta'] = pd.to_timedelta(df_event['timedelta'], unit='T')

输出:

                   date numb_total  timedelta
id          
1   2020-01-01 12:00:00          8   00:55:00
2   2020-01-01 15:00:00         25   01:00:00
3   2020-01-08 07:00:00         11   00:45:00
4   2020-01-15 13:00:00         14   00:15:00
5   2020-01-22 12:00:00          8   00:30:00

现在我想将两个 dfs 链接在一起,以便获得一天/一周的个人资料。df 应按小时/天排序。然后,该时间段的平均值numb和平均值应显示在此处。timedelta

周配置文件应该显示哪个numbtimedelta(来自 df_event)是各自的平均值moment = day + time(有趣的是任何时刻的最小值和最大值)。

例如df_week创建一个新的 df2 像:

df['day'] = df['date'].dt.day_name()
df['time'] = df['date'].dt.time   
df_event = df.groupby(['day', 'time'])...

而不是添加`df_event的数据,得到这样的东西:

                       timedelta  numb_total
day             time    
Monday      00:00:00    00:00:00          0
Monday      01:00:00    00:00:00          0 
...
Wednesday   11:00:00    00:00:00          0
Wednesday   12:00:00    00:55:00          8
...
Sunday      14:00:00    00:00:00          0
Sunday      15:00:00    01:00:00         25
Sunday      16:00:00    00:00:00          0
...
Sunday      23:00:00    00:00:00          0

标签: pythonpandasdataframepandas-groupby

解决方案


#df中的索引和日期是什么关系?它们都是日期。哪个与 df_event 日期有关系?

很高兴在您澄清后进行审查。

#Generate column key in each datframe extracting hour. Merge the two dataframes on key. Drop columns not required

df2=pd.merge(df.assign(key=df.index.hour),df_event.assign(key=df_event.set_index('date')\
.index.hour),on=['key','date'],how='right').dropna().drop_duplicates(keep='last')[['date','numb_total','timedelta']]


#Extract time and  day_name 


df2['time']=df2.date.dt.strftime('%H:%M:%S')
df2['day']=df2.date.dt.day_name()



    date  n             umb_total    timedelta      time        day
0 2020-01-01 12:00:00           8      00:55:00     12:00:00  Wednesday

推荐阅读