2017-01-26 122 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