我正在尝试合并2个数据帧,在某些列上完全匹配,而在其他列上(通常是日期)匹配as_of
。这篇文章很好地描述了这个意图(我将在下面复制粘贴主要内容):
Pandas: Approximate join on one column, exact match on other columns
上面的帖子被回答了;只有它的历史可以追溯到2016年,开始采用pandas.merge_asof
。我相信现在已经发布了一个更简单的答案。残酷的方法是将每组行的as_of合并为我要完全合并的cols的相同值。但是还有更优雅的版本吗?
所需输入和输出的精确描述:
输入
df1 = pd.DataFrame({'index': ['a1','a2','a3','a4'], 'col1': ['1232','432','432','123'], 'col2': ['asd','dsa12','dsa12','asd2'], 'col3': ['1','2','2','3'], 'date': ['2010-01-23','2016-05-20','2010-06-20','2008-10-21'],}).set_index('index')
df1
Out[430]:
col1 col2 col3 date
index
a1 1232 asd 1 2010-01-23
a2 432 dsa12 2 2016-05-20
a3 432 dsa12 2 2010-06-20
a4 123 asd2 3 2008-10-21
df2 = pd.DataFrame({'index': ['b1','b2','b3','b4'], 'col1': ['132','432','432','123'], 'col2': ['asd','dsa12','dsa12','sd2'], 'col3': ['1','2','2','3'], 'date': ['2010-01-23','2016-05-23','2010-06-10','2008-10-21'],}).set_index('index')
df2
Out[434]:
col1 col2 col3 date b_col
index
b1 132 asd 1 2010-01-23 1
b2 432 dsa12 2 2016-05-23 2
b3 432 dsa12 2 2010-06-10 3
b4 123 sd2 3 2008-10-21 4
输出:
col1 col2 col3 date b_col
index
a2 432 dsa12 2 2016-05-20 2
a3 432 dsa12 2 2010-06-20 3
注1:之所以需要这样做,是因为我需要像groupby(...)[...].rolling(...).transform(...)
这样的东西,但它似乎还不存在延迟,除非我错过了什么?
注意2:我想避免计算所有对,然后过滤,因为数据框可能会变得太大。
答案 0 :(得分:0)
我已尽力解决您的问题。但是,我没有尝试merge_asof而是合并。我希望这种方法可以为您提供帮助:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'index': ['a1', 'a2', 'a3', 'a4'], 'col1': ['1232', '432', '432', '123'],
'col2': ['asd', 'dsa12', 'dsa12', 'asd2'], 'col3': ['1', '2', '2', '3'],
'date': ['2010-01-23', '2016-05-20', '2010-06-20', '2008-10-21'],
}).set_index('index')
df2 = pd.DataFrame({'index': ['b1', 'b2', 'b3', 'b4'], 'col1': ['132', '432', '432', '123'],
'col2': ['asd', 'dsa12', 'dsa12', 'sd2'], 'col3': ['1', '2', '2', '3'],
'date': ['2010-01-23', '2016-05-23', '2010-06-10', '2008-10-21'],
}).set_index('index')
columns = ['col1', 'col2', 'col3']
new_dic = pd.merge(df1, df2, on=columns, right_index=True).drop_duplicates(subset=['date_x']).drop(labels='date_y', axis=1)
print(new_dic)