2017-01-26 123 views
1
import pandas as pd 

df1 = pd.DataFrame({'date': ['2015-01-01', '2015-01-10', '2015-01-11', '2015-01-12'], 'a': [1,2,3,4]}) 

df2 = pd.DataFrame({'date': ['2015-01-01', '2015-01-05', '2015-01-11'], 'b': [10,20,30]}) 

df = df1.merge(df2, on=['date'], how='outer') 

df = df.sort_values('date') 

print df 

“像磁性的东西”可能无法在标题很好的体现。我将在下面解释。大熊猫合并DataFrames像磁事情

我想从df2记录匹配df1的第一条记录,该日期大于或等于df2。例如,我想让df2的'2015-01-05'与df1的'2015-01-10'相匹配。

我不能通过将它们合并在inner,outer,left的方式来实现它。尽管如此,上述结果与我想要的非常接近。

 a  date  b 
0 1.0 2015-01-01 10.0 
4 NaN 2015-01-05 20.0 
1 2.0 2015-01-10 NaN 
2 3.0 2015-01-11 30.0 
3 4.0 2015-01-12 NaN 

如何从我从事的工作或从其他方面从头开始做到这一点?

 a  date  b 
0 1.0 2015-01-01 10.0 
1 2.0 2015-01-10 20.0 
2 3.0 2015-01-11 30.0 
3 4.0 2015-01-12 NaN 

回答

1

确保您的日期是日期

df1.date = pd.to_datetime(df1.date) 
df2.date = pd.to_datetime(df2.date) 

numpy
np.searchsorted

ilocs = df1.date.values.searchsorted(df2.date.values) 
df1.loc[df1.index[ilocs], 'b'] = df2.b.values 

df1 

    a  date  b 
0 1 2015-01-01 10.0 
1 2 2015-01-10 20.0 
2 3 2015-01-11 30.0 
3 4 2015-01-12 NaN 

pandas
pd.merge_asof让你真正接近

pd.merge_asof(df1, df2) 

    a  date b 
0 1 2015-01-01 10 
1 2 2015-01-10 20 
2 3 2015-01-11 30 
3 4 2015-01-12 30 
+0

我决心要兼得。不知道是否有可能...但尝试 – piRSquared

+1

超级,numpy解决方案获得所需的输出。 – jezrael

+0

谢谢,它的作品像魅力! – gzc