python - 将两个具有相同开始日期和结束日期但缺少值的熊猫数据帧连接在一起
问题描述
我有两个 DataFrame 对象df1
和df2
,它们都包含来自相同开始日期和结束日期的数据。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 以便它们具有完全匹配的日期和时间戳以及相同的行数(在 df2 中删除某些行)。理想情况下,与 对应的所有值都df1
必须存在于 中df2
,但在两者之间存在一些缺失值并且它们是未知的。
我想合并df1
并df2
处理缺失值。帮助表示赞赏!
解决方案
鉴于描述,我建议使用pd.concat
or 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
推荐阅读
- apache-spark - EMR (emr-5.26.0) 上的 CORE 节点的纱线队列容量未按预期工作
- python - scipy的labeled_comprehension“沿轴”的模拟
- angular - 无法从浏览器访问 Angular 应用容器
- amazon-web-services - Lambda 的 CloudWatch 日志
- excel - Excel宏冻结
- javascript - JavaScript中使用数组的图像旋转
- perforce - P4API.net:如何使用 P4Callbacks 委托
- c# - 从列表比较中检索所有值并修改它们
- node.js - 使用 Mongoose 和 Node.js 更新 MongoDB 中的数据
- mlflow - 如何使用数据预处理(文本数据)部署 mlflow 模型