首页 > 解决方案 > 将两个具有相同开始日期和结束日期但缺少值的熊猫数据帧连接在一起

问题描述

我有两个 DataFrame 对象df1df2,它们都包含来自相同开始日期和结束日期的数据。df1共有 17376 行。每date行有 48 行(时间戳 xx:00 和 xx:30 每小时 2 个值),总共有 362 天(请参阅下面的图片链接)。df2是一个更大的 DataFrame,每天有 144 行(每小时 6 个值 - xx:00、xx:10、xx:20、xx:30、xx:40、xx:50)。(下面的图片链接)

df1 的日期时间组织

df2 的日期时间组织

我想加入 df1 和 df2 以便它们具有完全匹配的日期和时间戳以及相同的行数(在 df2 中删除某些行)。理想情况下,与 对应的所有值都df1必须存在于 中df2,但在两者之间存在一些缺失值并且它们是未知的。

我想合并df1df2处理缺失值。帮助表示赞赏!

标签: pythonpandasdataframe

解决方案


鉴于描述,我建议使用pd.concator merge。这是一个测试示例:

import pandas as pd

#generating test data
index1 = pd.date_range('1/1/2000', periods=9, freq='D')
index2 = pd.date_range('1/4/2000', periods=9, freq='D')
series = range(9)
df1 = pd.DataFrame([index1,series]).T
df2 = pd.DataFrame([index2,series]).T
df1.columns = ['Time','Data']
df2.columns = ['Time','Data']

df1

                  Time Data
0  2000-01-01 00:00:00    0
1  2000-01-02 00:00:00    1
2  2000-01-03 00:00:00    2
3  2000-01-04 00:00:00    3
4  2000-01-05 00:00:00    4
5  2000-01-06 00:00:00    5
6  2000-01-07 00:00:00    6
7  2000-01-08 00:00:00    7
8  2000-01-09 00:00:00    8                 

df2

                  Time Data
0  2000-01-04 00:00:00    0
1  2000-01-05 00:00:00    1
2  2000-01-06 00:00:00    2
3  2000-01-07 00:00:00    3
4  2000-01-08 00:00:00    4
5  2000-01-09 00:00:00    5
6  2000-01-10 00:00:00    6
7  2000-01-11 00:00:00    7
8  2000-01-12 00:00:00    8

请注意,两个数据框中的不同日期的数据可用。

#convert Time to pandas datetime format
#df1['Time'].to_datetime(df1['Time']) # <- uncomment this for your case
#df1['Time'].to_datetime(df1['Time'])  # <- uncomment this for your case

#making the time the index of the dataframes
df1.set_index(['Time'],inplace=True)
df2.set_index(['Time'],inplace=True)

#concatenating the dataframe column wise (axis=1)
df3 = pd.concat([df1,df2],axis=1)
print(df3)

输出

           Data Data
Time                
2000-01-01    0  NaN
2000-01-02    1  NaN
2000-01-03    2  NaN
2000-01-04    3    0
2000-01-05    4    1
2000-01-06    5    2
2000-01-07    6    3
2000-01-08    7    4
2000-01-09    8    5
2000-01-10  NaN    6
2000-01-11  NaN    7
2000-01-12  NaN    8

照顾缺失值

pd.concat根据数据正确合并数据。NaN 表示合并后的缺失值,主要可以用 fillna填充某物代替NaN)或dropna删除包含的数据NaN)来处理。以下是fillna(dropna的使用方式完全相同但没有0) 的示例:

#filling 0's inplace of `NaN`. You can use also method='bfill' or 'ffill' or interpolate
df3 = df3.fillna(0,inplace=True) 
#df3 = df3.fillna(method='bfill',inplace=True) # <- uncomment if you want to use this
#df3 = df3.fillna(method='ffill',inplace=True) # <- uncomment if you want to use this

输出

             Data  Data
Time                  
2000-01-01     0     0
2000-01-02     1     0
2000-01-03     2     0
2000-01-04     3     0
2000-01-05     4     1
2000-01-06     5     2
2000-01-07     6     3
2000-01-08     7     4
2000-01-09     8     5
2000-01-10     0     6
2000-01-11     0     7
2000-01-12     0     8

推荐阅读