python - 如何将不同的数据集与日期时间索引合并?
问题描述
我有两个数据集(批次和测量),它们都有日期时间索引,但长度和列不同。第一个数据集(Lots)的结构如下:
日期时间索引 | 地段组 | 批号 | 预订水平 |
---|---|---|---|
2013-08-03 10:00:00 | 1 | 261291.0 | PROB1H |
2013-08-03 12:00:00 | 1 | 261228.0 | PROB1H |
另一个(测量)的结构如下:
日期时间索引 | 中 | 通过了? | 测量1 | 测量2 | 测量3 |
---|---|---|---|---|---|
2013-08-28 10:00:00 | 12345 | 真的 | 46.908 | 3.89 | 29.056 |
2013-08-03 12:00:00 | 78262 | 真的 | 89.457 | 6.88 | 34.918 |
我想要做的是合并日期时间索引上的两个数据帧并获取两个数据帧中的所有列,如果日期时间索引上有匹配项,它将添加 MID,通过?和Lots数据框的测量列,如果有任何重复项,也会保留重复项,并且还会将缺失值保留为NaN,例如:
假设日期时间 2013-08-28 10:00:00 不存在于 lot 数据框中,但存在于 Measurement 数据框中,这样会产生:
日期时间索引 | 地段组 | 批号 | 预订水平 | 中 | 通过了? | 测量1 | 测量2 | 测量3 |
---|---|---|---|---|---|---|---|---|
2013-08-28 10:00:00 | 钠 | 钠 | 钠 | 12345 | 真的 | 46.908 | 3.89 | 29.056 |
如果在日期时间 2013-08-03 12:00:00 中有匹配项,它将产生:
日期时间索引 | 地段组 | 批号 | 预订水平 | 中 | 通过了? | 测量1 | 测量2 | 测量3 |
---|---|---|---|---|---|---|---|---|
2013-08-03 12:00:00 | 1 | 261228.0 | PROB1H | 78262 | 真的 | 89.457 | 6.88 | 34.918 |
很多数据框的日期时间索引只有唯一的日期时间值,但测量数据框有重复的条目,所以如果与重复的条目匹配,我想获得重复的行,例如:
假设日期时间 2021-04-15 22:00:00 出现在两个数据框中,但在 Measurement 数据框中多次出现,因此它会产生以下结果:
日期时间索引 | 地段组 | 批号 | 预订水平 | 中 | 通过了? | 测量1 | 测量2 | 测量3 |
---|---|---|---|---|---|---|---|---|
2021-04-15 22:00:00 | 2 | 311000.0 | PROB2H | 34903 | 真的 | 39 | 67 | 50 |
2021-04-15 22:00:00 | 2 | 311000.0 | PROB2H | 34904 | 真的 | 88 | 40.90 | 54.38 |
我尝试了不同的合并,但无法得到我想要的结果:
test = lots.merge(measurement, how = "right",left_index=True, right_index=True)
test2 = lots.merge(measurement, how = "outer",left_index=True, right_index=True)
你会建议我怎么做,提前谢谢。
解决方案
join
您也可以使用merge
:
# Dataset Lots
>>> dfL
Lot Group Lot No Booking Level
Datetime Index
2013-08-03 10:00:00 1 261291.0 PROB1H
2013-08-03 12:00:00 1 261228.0 PROB1H
2021-04-15 22:00:00 2 311000.0 PROB2H
# Dataset Measurements
>>> dfM
MID Passed? Measurement1 Measurement2 Measurement3
Datetime Index
2013-08-28 10:00:00 12345 True 46.908 3.89 29.056
2013-08-03 12:00:00 78262 True 89.457 6.88 34.918
2021-04-15 22:00:00 34903 True 39.000 67.00 50.000
2021-04-15 22:00:00 34904 True 88.000 40.90 54.380
# Join version
>>> dfL.join(dfM, how='outer')
Datetime Index Lot Group Lot No Booking Level MID Passed? Measurement1 Measurement2 Measurement3
2013-08-03 10:00:00 1.0 261291.0 PROB1H NaN NaN NaN NaN NaN
2013-08-03 12:00:00 1.0 261228.0 PROB1H 78262.0 True 89.457 6.88 34.918
2013-08-28 10:00:00 NaN NaN NaN 12345.0 True 46.908 3.89 29.056
2021-04-15 22:00:00 2.0 311000.0 PROB2H 34903.0 True 39.000 67.00 50.000
2021-04-15 22:00:00 2.0 311000.0 PROB2H 34904.0 True 88.000 40.90 54.380
# Merge version
>>> dfL.merge(dfM, how='outer', left_index=True, right_index=True)
Datetime Index Lot Group Lot No Booking Level MID Passed? Measurement1 Measurement2 Measurement3
2013-08-03 10:00:00 1.0 261291.0 PROB1H NaN NaN NaN NaN NaN
2013-08-03 12:00:00 1.0 261228.0 PROB1H 78262.0 True 89.457 6.88 34.918
2013-08-28 10:00:00 NaN NaN NaN 12345.0 True 46.908 3.89 29.056
2021-04-15 22:00:00 2.0 311000.0 PROB2H 34903.0 True 39.000 67.00 50.000
2021-04-15 22:00:00 2.0 311000.0 PROB2H 34904.0 True 88.000 40.90 54.380
推荐阅读
- python - 将不同的功能应用于数据框中的不同行
- java - 如何确保不使用构造函数设置对象的所有属性?
- c# - 使用 \ 作为转义字符会产生意外的输出
- react-native - 如何使用 Axios React Native 在 FlatList 中渲染 Resonse?
- swift - Swift - 循环中的异步调用
- reactjs - Reactjs/Redux 在 redux 操作完成时创建通知
- python - 使用 scrapy 和 selenium 抓取动态内容
- c - 获取GPU温度的C程序
- flutter - Flutter 硬件音量键检测?
- javascript - 使用节点 js API 在 React js 上的 Hyperledger Fabric 2.2 前端