首页 > 解决方案 > 如何用另一个数据帧中的元素填补一个 Pandas 数据帧中缺失的空白

问题描述

我正在努力弄清楚如何获取一个数据框中存在的元素,并根据他们的时间列使用它们来填充另一个数据框中的缺失值。

我有一个有分钟数据,但其中有一些差距(跨越几乎一天),另一个有每小时数据而没有差距。我想用每小时数据填充分钟数据中缺失的行,而不复制分钟数据中的小时数。

import pandas as pd
df1 = pd.DataFrame({'Unix Timestamp': [1444311660, 1444311720, 1444311780, 1444311840, 1444311900,
   1444312140], 'price': [242.5, 242.5, 243.7, 290.0, 293.0, 287.0]})

df2 = pd.DataFrame({'Unix Timestamp': [1444311780, 1444311840, 1444311900, 1444311960, 1444312020],
       'price': [243.7, 290.0, 293.0, 295.0, 294.0]})

print(df1.head())
print(df2.head())
df1
Unix Timestamp  price  
1444311660      242.5  
1444311720      242.5
1444311780      243.7
1444311840      290
1444311900      293
1444312140      287

df2
Unix Timestamp  price
1444311780      243.7
1444311840      290
1444311900      293
1444311960      295
1444312020      294

我已经尝试在 df2 中找到 Unix 时间戳不在 df1 中的 Unix 时间戳列表中的行,然后添加它们并根据 Unix 时间戳重新排序,但它给了我一个空数据框

missing = df1.loc[~df1['Unix Timestamp'].isin(df2['Unix Timestamp'])]
df1 = pd.concat([df1, missing], ignore_index=True, sort=False)
df1 = df1.sort_values(by='Unix Timestamp')
df1 = df1.reset_index(drop=True)
print(df1.head(10))

预期输出:

df1
Unix Timestamp  price  
1444311660      242.5  
1444311720      242.5
1444311780      243.7
1444311840      290
1444311900      293
1444311960      295   ^
1444312020      294   ^
1444312140      287

添加了插入符号以提请注意添加了哪些行。我还需要使用整行,因为实际列中的列比价格多

有什么帮助吗?

标签: pythonpandasdataframe

解决方案


您可以.concat使用数据框并摆脱欺骗drop_duplicates。我还在第二个数据帧中添加了一added.assign(),因此您可以看到从第二个数据帧到第一个数据帧中添加了哪些值。

df = (pd.concat([df1,df2.assign(added='^')])
      .drop_duplicates(subset=['Unix Timestamp', 'price'])
      .sort_values('Unix Timestamp')
      .fillna(''))
df
Out[1]: 
   Unix Timestamp  price added
0      1444311660  242.5      
1      1444311720  242.5      
2      1444311780  243.7      
3      1444311840  290.0      
4      1444311900  293.0      
3      1444311960  295.0     ^
4      1444312020  294.0     ^
5      1444312140  287.0      

推荐阅读