如何在不迭代的情况下获取两个DataFrame之间的匹配值

时间:2019-07-22 21:11:41

标签: python pandas dataframe

我有一个叫DataFrame的大熊猫df1,看起来像:

value     analysis_date                   hour   error
7         2000-01-01 00:00:00    9      None
8         2000-01-01 00:00:00    10     None
9         2000-01-01 00:00:00    11     None

第二个DataFramedf2

value     analysis_date          hour   error
4         2000-01-01 09:00:00    1      None
5         2019-01-01 00:00:00    2      None
6         2000-01-01 08:00:00    3      None

我想

  • 比较“对应”行,这意味着analysis_datehour之间df1 + df2等价的行;表示df1第2和第3行分别与df2第3和第1行相对应
  • 然后,我想将error中的df1列设置为该对应行的df1['value'][row] - df2['value'][row]。因此,在这种情况下,df1应该最终看起来像这样:
value     analysis_date                   hour   error
7         2000-01-01 00:00:00    9      None
8         2000-01-01 00:00:00    10     4
9         2000-01-01 00:00:00    11     3

除了遍历每一行并使用iterrows()分别比较它们之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

您可以这样处理:

df1['analysis_date'] = pd.to_datetime(df1['analysis_date'])
df2['analysis_date'] = pd.to_datetime(df2['analysis_date'])
df2['total_date'] = df2.analysis_date + df2.hour.astype('timedelta64[h]')
df1['total_date'] = df1.analysis_date + df1.hour.astype('timedelta64[h]')
mr_df = df1.merge(df2.loc[:,['value', 'total_date']], on = 'total_date', how = 'left')
df1['error'] = mr_df['value_x'] - mr_df['value_y']
df1 
#   value       date  hour  error          total_date
# 0      7 2000-01-01     9    NaN  2000-01-01 09:00:00
# 1      8 2000-01-01    10    4.0  2000-01-01 10:00:00
# 2      9 2000-01-01    11    3.0  2000-01-01 11:00:00