【问题标题】:keep both merging keys after pandas.merge_asof在 pandas.merge_asof 之后保留两个合并键
【发布时间】:2018-10-14 13:32:01
【问题描述】:

我发现了这个不错的函数pandas.merge_asof。 来自文档

pandas.merge_asof(left, right, on=None, left_on=None, right_on=None)

Parameters: 

left : DataFrame
right : DataFrame
on : label

Field name to join on. Must be found in both DataFrames.
The data MUST be ordered. 
Furthermore this must be a numeric column,such as datetimelike, integer, or float. 
On or left_on/right_on must be given.

它按预期工作。

但是,我的合并数据框只保留了 on 列中的原始列 left。我需要保留它们,所以要有

   mydf=pandas.merge_asof(left, right, on='Time')

mydf 包含来自leftrightTime

示例数据:

a=pd.DataFrame(data=pd.date_range('20100201', periods=100, freq='6h3min'),columns=['Time'])
b=pd.DataFrame(data=
                  pd.date_range('20100201', periods=24, freq='1h'),columns=['Time'])
b['val']=range(b.shape[0])
out=pd.merge_asof(a,b,on='Time',direction='forward',tolerance=pd.Timedelta('30min'))

【问题讨论】:

  • 你能添加一些数据样本吗?
  • 我在上面……等等

标签: python pandas merge


【解决方案1】:

我认为一种可能的解决方案是重命名列:

out = pd.merge_asof(a.rename(columns={'Time':'Time1'}), 
                    b.rename(columns={'Time':'Time2'}), 
                    left_on='Time1',
                    right_on='Time2',
                    direction='forward',
                    tolerance=pd.Timedelta('30min'))

print (out.head())
                Time1      Time2  val
0 2010-02-01 00:00:00 2010-02-01  0.0
1 2010-02-01 06:03:00        NaT  NaN
2 2010-02-01 12:06:00        NaT  NaN
3 2010-02-01 18:09:00        NaT  NaN
4 2010-02-02 00:12:00        NaT  NaN

【讨论】:

  • 可惜还是没有比改名更好的办法
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2016-12-14
  • 2021-06-26
  • 2023-03-28
  • 1970-01-01
  • 2015-12-27
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多