python - 使用 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
周配置文件应该显示哪个numb
和timedelta
(来自 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
解决方案
#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
推荐阅读
- javascript - React 不更新 HTML 或状态不同步
- react-native - react-native-modal 使背景平面列表可点击
- javascript - 在 D3 中转换 SVG 行时,会立即出现新行
- javascript - 未在新创建的 div 中复制的数据仅被复制的名称
- java - 静态变量永远不会更新
- spring - 本地化 Spring 麻烦隐藏的地方
- list - 在 List 中创建 List 的第一个元素 - Flutter、Dart
- docker - Selenium.WebDriverException:消息:未知错误:net::ERR_NAME_NOT_RESOLVED
- r - 在R中通过不同的row.names合并两个data.frames
- r - 逐个元素与 NA 和 NULL 比较列表