Python Pandas:将三个数据帧与一个公共日期列合并,而不会丢失最终结果的任何行



我正在尝试合并 3 个具有公共日期列(用作索引)的数据帧

第一个数据帧包含空气污染物和降水的一些值:

╔════════════╦═══════════════╦═════════╦═════════╦═════╦═════════╦═════╗
║ DATE       ║ PRECIPITATION ║ PM 10   ║ PM 2.5  ║ NO2 ║ SO2     ║ CO  ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-01 ║ 0.0           ║ 129.2   ║ 49.3    ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-02 ║ -9999.0       ║ -9999.0 ║ -9999.0 ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-03 ║ -9999.0       ║ NaN     ║ -9999.0 ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-04 ║ -9999.0       ║ -9999.0 ║ -9999.0 ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-05 ║ NaN           ║ NaN     ║ NaN     ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-06 ║ -9999.0       ║ -9999.0 ║ -9999.0 ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-07 ║ 2.7           ║ 78.1    ║ 24.4    ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-08 ║ 5.3           ║ 99.9    ║ 31.1    ║ NaN ║ NaN     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-09 ║ 0.1           ║ 116.5   ║ 36.3    ║ NaN ║ -9999.0 ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-10 ║ 0.0           ║ 100.2   ║ 30.8    ║ NaN ║ 5.0     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-11 ║ 0.0           ║ 113.3   ║ 34.5    ║ NaN ║ 4.4     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-12 ║ 0.0           ║ 85.4    ║ 28.6    ║ NaN ║ 3.2     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-13 ║ 0.0           ║ 55.7    ║ 16.6    ║ NaN ║ 2.7     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-14 ║ 5.0           ║ 89.6    ║ 27.4    ║ NaN ║ 3.8     ║ NaN ║
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣
║ 2009-01-15 ║ 1.0           ║ 109.9   ║ 32.2    ║ NaN ║ 4.6     ║ NaN ║
╚════════════╩═══════════════╩═════════╩═════════╩═════╩═════════╩═════╝

。日期一直持续到2009-12-31

第二个数据帧包含最大、最小和平均温度值:

╔════════════╦═════════╦══════╦══════════╗
║ DATE       ║ min     ║ max  ║ avg      ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-01 ║ 10.1    ║ 13.1 ║ 11.47    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-02 ║ 13.3    ║ 18.7 ║ 16.38    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-03 ║ -9999.0 ║ 13.1 ║ -2490.10 ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-04 ║ NaN     ║ NaN  ║ NaN      ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-05 ║ -9999.0 ║ 20.8 ║ -698.73  ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-06 ║ 11.4    ║ 17.9 ║ 14.64    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-07 ║ 11.2    ║ 18.9 ║ 14.60    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-08 ║ 10.2    ║ 19.1 ║ 14.65    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-09 ║ 9.4     ║ 18.4 ║ 14.05    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-10 ║ 9.2     ║ 20.7 ║ 13.85    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-11 ║ 9.7     ║ 17.8 ║ 14.32    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-12 ║ 12.4    ║ 17.8 ║ 14.83    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-13 ║ 12.4    ║ 17.1 ║ 14.51    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-14 ║ 7.0     ║ 19.7 ║ 13.77    ║
╠════════════╬═════════╬══════╬══════════╣
║ 2009-01-15 ║ 10.5    ║ 17.0 ║ 13.93    ║
╚════════════╩═════════╩══════╩══════════╝

第三个包含 ERA 结果的数量:

╔════════════╦═════════════════╗
║ DATE       ║ NUMBER OF CASES ║
╠════════════╬═════════════════╣
║ 2009-05-01 ║ 63.0            ║
╠════════════╬═════════════════╣
║ 2009-05-02 ║ 38.0            ║
╠════════════╬═════════════════╣
║ 2009-05-03 ║ 33.0            ║
╠════════════╬═════════════════╣
║ 2009-05-04 ║ 161.0           ║
╠════════════╬═════════════════╣
║ 2009-05-05 ║ 192.0           ║
╠════════════╬═════════════════╣
║ 2009-05-06 ║ 164.0           ║
╠════════════╬═════════════════╣
║ 2009-05-07 ║ 149.0           ║
╠════════════╬═════════════════╣
║ 2009-05-08 ║ 159.0           ║
╠════════════╬═════════════════╣
║ 2009-05-09 ║ 42.0            ║
╠════════════╬═════════════════╣
║ 2009-05-10 ║ 44.0            ║
╠════════════╬═════════════════╣
║ 2009-05-11 ║ 154.0           ║
╠════════════╬═════════════════╣
║ 2009-05-12 ║ 143.0           ║
╠════════════╬═════════════════╣
║ 2009-05-13 ║ 165.0           ║
╠════════════╬═════════════════╣
║ 2009-05-14 ║ 166.0           ║
╠════════════╬═════════════════╣
║ 2009-05-15 ║ 153.0           ║
╚════════════╩═════════════════╝

我正在尝试做的是合并三个数据帧并生成一个数据帧,其中包含按同一日期索引的所有数据。

我使用的代码如下:

import pandas.io.sql as psql
import pandas as pd
connection_first_second_dataf = pg.connect("dbname=db_1 user=postgres")
connection_third_dataf = pg.connect("dbname=db_2 user=postgres")
first_dataframe = psql.read_sql("SELECT * FROM "VIEW_1"", connection_first_second_dataf)
second_dataframe = psql.read_sql("SELECT * FROM "VIEW_2"", connection_first_second_dataf)
thir_dataframe = psql.read_sql("SELECT * FROM "VIEW_3"", connection_third_dataf)

dataframe_result = pd.merge(first_dataframe,
second_dataframe, 
on='DATE')
dataframe_result = pd.merge(dataframe_result,
thir_dataframe, 
on='DATE')

最终结果如下:

╔════════════╦═══════════════╦═══════╦════════╦═════╦═════╦═════════╦══════╦══════╦═══════╦═════════════════╗
║ DATE       ║ PRECIPITATION ║ PM 10 ║ PM 2.5 ║ NO2 ║ SO2 ║ CO      ║ min  ║ max  ║ avg   ║ NUMBER OF CASES ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-01 ║ 4.0           ║ 79.2  ║ 31.2   ║ NaN ║ 6.7 ║ 0.5     ║ 10.4 ║ 17.2 ║ 14.34 ║ 63.0            ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-02 ║ 0.0           ║ 82.2  ║ 28.9   ║ NaN ║ 7.3 ║ 0.4     ║ 12.5 ║ 17.4 ║ 14.76 ║ 38.0            ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-03 ║ 0.2           ║ 77.1  ║ 23.0   ║ NaN ║ 4.1 ║ 0.4     ║ 11.9 ║ 16.4 ║ 14.05 ║ 33.0            ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-04 ║ 0.6           ║ 53.8  ║ 13.7   ║ NaN ║ 2.3 ║ -9999.0 ║ 11.4 ║ 15.9 ║ 13.35 ║ 161.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-05 ║ 0.7           ║ 50.4  ║ 17.0   ║ NaN ║ 2.5 ║ -9999.0 ║ 12.5 ║ 18.6 ║ 14.89 ║ 192.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-06 ║ 0.0           ║ 76.1  ║ 23.8   ║ NaN ║ 5.1 ║ -9999.0 ║ 11.8 ║ 17.4 ║ 14.43 ║ 164.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-07 ║ 0.3           ║ 97.7  ║ 34.0   ║ NaN ║ 9.6 ║ -9999.0 ║ 13.2 ║ 20.6 ║ 15.82 ║ 149.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-08 ║ 0.2           ║ 69.6  ║ 20.3   ║ NaN ║ 5.5 ║ -9999.0 ║ 11.6 ║ 20.4 ║ 15.49 ║ 159.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-09 ║ 0.0           ║ 87.4  ║ 26.3   ║ NaN ║ 5.2 ║ -9999.0 ║ 12.9 ║ 19.4 ║ 15.69 ║ 42.0            ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-10 ║ 0.0           ║ 74.6  ║ 19.9   ║ NaN ║ 3.6 ║ 0.3     ║ 12.8 ║ 19.0 ║ 15.52 ║ 44.0            ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-11 ║ 0.6           ║ 57.6  ║ 17.1   ║ NaN ║ 3.6 ║ -9999.0 ║ 12.5 ║ 20.2 ║ 15.48 ║ 154.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-12 ║ 0.0           ║ 63.7  ║ 19.5   ║ NaN ║ 4.7 ║ -9999.0 ║ 9.9  ║ 20.0 ║ 14.97 ║ 143.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-13 ║ 0.0           ║ 95.4  ║ 27.6   ║ NaN ║ 6.4 ║ -9999.0 ║ 12.6 ║ 20.8 ║ 15.45 ║ 165.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-14 ║ 0.0           ║ 101.7 ║ 29.1   ║ NaN ║ 5.0 ║ 0.5     ║ 11.7 ║ 19.6 ║ 14.94 ║ 166.0           ║
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣
║ 2009-05-15 ║ 0.0           ║ 112.5 ║ 40.1   ║ NaN ║ 8.0 ║ 0.9     ║ 11.7 ║ 19.1 ║ 14.81 ║ 153.0           ║
╚════════════╩═══════════════╩═══════╩════════╩═════╩═════╩═════════╩══════╩══════╩═══════╩═════════════════╝

如我们所见,第一个和第二个数据帧从 2009-01-01 开始,第三个数据帧从 2009-05-01 开始,当我尝试将三个数据帧合并为一个数据帧时,最后一个数据帧从 2009-05-01 开始。

我的问题是,如何强制到最终数据帧以 2009-01-01 的值开头?(无论"病例数"列是否具有从 2009-01-01 到 2009-04-31 的 NaN 值,我知道我没有这些日期的任何数据)。

我已经阅读了熊猫的文档,但是我没有找到任何我需要的解决方案,也对不起我的英语,

谢谢。

怎么样:

result = first_dataframe 
.merge(second_dataframe, on='DATE', how='outer') 
.merge(thir_dataframe, on='DATE', how='outer')

较短的代码,关键字是"outer"。

最新更新