首页 > 解决方案 > 如何将不同的数据集与日期时间索引合并?

问题描述

我有两个数据集(批次和测量),它们都有日期时间索引,但长度和列不同。第一个数据集(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)

你会建议我怎么做,提前谢谢。

标签: pythonpandasdataframedatetimemerge

解决方案


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

推荐阅读