我有两个带有时间索引但规模不同的数据帧。第一个每天每 30 分钟有一次数据,另一个每天只有一个数据。我想用第二个数据框的值填充第一个数据框并保持第一个数据框的形状。
首先:
2019-08-26 13:00:00 a 1
2019-08-26 13:30:00 b 2
2019-08-26 14:00:00 c 3
2019-08-26 14:30:00 d 4
2019-08-26 15:00:00 e 5
第二个:
2019-08-25 X
2019-08-26 Y
2019-08-27 Z
想要的结果:
2019-08-26 13:00:00 a 1 Y
2019-08-26 13:30:00 b 2 Y
2019-08-26 14:00:00 c 3 Y
2019-08-26 14:30:00 d 4 Y
2019-08-26 15:00:00 e 5 Y
答案 0 :(得分:3)
您可以通过标准化 key
的索引在 df1
中创建临时合并 df1
,然后您应该能够merge
df1
与其他数据帧df2
基于此 merge
键:
df1.assign(key=df1.index.normalize())\
.merge(df2, left_on='key', right_index=True, how='left').drop('key', 1)
A B C
2019-08-26 13:00:00 a 1 Y
2019-08-26 13:30:00 b 2 Y
2019-08-26 14:00:00 c 3 Y
2019-08-26 14:30:00 d 4 Y
2019-08-26 15:00:00 e 5 Y
答案 1 :(得分:2)
只是为了把上一个答案放在眼里。 Shubham Sharma 的“魔法”线在以下情况下对我有用:
Date
列转换为 pandas.Timestamp
对象,以便能够对其应用 normalize()
函数 - 如果它不是这种格式,则将引发异常。Date
列设置为索引。代码可能如下所示:
import pandas as pd
df1 = pd.DataFrame([['2019-08-26 13:00:00', 'a', 1],
['2019-08-26 13:30:00', 'b', 2],
['2019-08-26 14:00:00', 'c', 3],
['2019-08-26 14:30:00', 'd', 4],
['2019-08-26 15:00:00', 'e', 5]], columns=['Date', 'A', 'B'])
df1['Date'] = pd.to_datetime(df1['Date'].astype(str), format='%Y-%m-%d %H:%M:%S')
df1.set_index('Date', inplace=True)
df2 = pd.DataFrame([['2019-08-25', 'X'], ['2019-08-26', 'Y'], ['2019-08-27', 'Z']], columns=['Date', 'A'])
df2['Date'] = pd.to_datetime(df2['Date'].astype(str), format='%Y-%m-%d %H:%M:%S')
df2.set_index('Date', inplace=True)
# Now comes Shubham Sharma's magic line
df3 = df1.assign(key=df1.index.normalize()).merge(df2, left_on='key', right_index=True, how='left').drop('key', 1)
# Set column names (except the index) to A, B and C
df3.columns = ['A', 'B', 'C']