寻找比for循环更快的方式来搜索和附加带有Pandas的

时间:2017-06-12 20:41:32

标签: python pandas

我正在寻找更快的替代方案:

def add_weather_data(data, weather):
    w = pd.DataFrame()
    for date in data.date:
        w = w.append(weather.iloc[weather.index.get_loc(date, method='nearest')])
    return pd.concat([data, w.set_index(data.index)], axis=1)

详细说明,我有两个DataFrame:data包含我的数据集以及一个名为date的列,其中填充了pd.Timestamp&#39},而weather包含数据以DatetimeIndex索引。对于data中的每一行,我希望在data.date中搜索距离weather最近的索引,并将weather中的该行追加到此data行(丢弃DatetimeIndex中的weather

上面的功能是否有更好的选择?我的方法似乎需要很长时间才能运行......谢谢!

2 个答案:

答案 0 :(得分:2)

pd.DataFrame.reindexmethod='nearest'

一起使用
def add_weather_data(data, weather):
    w = weather.reindex(data.date, method='nearest')
    return pd.concat([data.set_index('date'), w], axis=1)

考虑示例数据框dataweather

data = pd.DataFrame(dict(date=pd.date_range('2017-03-31', periods=5), A=range(5)))

tidx = pd.date_range('2017-03-01', '2017-04-05', freq='7H')
weather = pd.DataFrame(dict(B=range(len(tidx))), tidx)

然后

add_weather_data(data, weather)

            A    B
date              
2017-03-31  0  103
2017-04-01  1  106
2017-04-02  2  110
2017-04-03  3  113
2017-04-04  4  117

对评论的回应

def add_weather_data(data, weather):
    w = weather.reindex(data.date, method='nearest')
    return data.join(w, on='date')

答案 1 :(得分:0)

如何简单地joining表格呢?

但看起来你想要最近的约会。也许创建一个包含所有日期的表,并使用Pandas interpolate函数填充缺失值。然后将其加入原始数据框?