2017-06-07 153 views
3

我有一個龐大的熊貓數據框採用這種結構:比較兩個大熊貓據幀大小不同

df1: 
    A B 
0 0 12 
1 0 15 
2 0 17 
3 0 18 
4 1 45 
5 1 78 
6 1 96 
7 1 32 
8 2 45 
9 2 78 
10 2 44 
11 2 10 

,第二個,像這樣的小:

df2 
    G H 
0 0 15 
1 1 45 
2 2 31 

我要添加列我的第一個數據框遵循這個規則:column df1.C = df2.H when df1.A == df2.G

我設法用for循環做,但數據庫很大,代碼運行速度非常慢,所以我正在尋找熊貓的方式或numpy做到這一點。

非常感謝,

鮑里斯

+0

那麼,是否所有來自df2.G的元素都保證在df1.A中? df2.G是否已分類?實際用例中輸入數據框的形狀是什麼? – Divakar

+0

輸入數據包含更多的列/行,但結構相同。我需要的功能是'DataFrame.merge()'這是完美的工作 – boris

回答

1

你可能想用合併:

df=df1.merge(df2,left_on="A",right_on="G") 

會給你一個數據幀有3列,但第三人的名字將是H

df.columns=["A","B","C"] 

然後會給你你想要的列名

+0

它完美的工作!非常感謝。 – boris

0

可以使用map通過Seriesset_index創建:

df1['C'] = df1['A'].map(df2.set_index('G')['H']) 
print (df1) 
    A B C 
0 0 12 15 
1 0 15 15 
2 0 17 15 
3 0 18 15 
4 1 45 45 
5 1 78 45 
6 1 96 45 
7 1 32 45 
8 2 45 31 
9 2 78 31 
10 2 44 31 
11 2 10 31 

或者mergedroprename

df = df1.merge(df2,left_on="A",right_on="G", how='left') 
     .drop('G', axis=1) 
     .rename(columns={'H':'C'}) 
print (df) 
    A B C 
0 0 12 15 
1 0 15 15 
2 0 17 15 
3 0 18 15 
4 1 45 45 
5 1 78 45 
6 1 96 45 
7 1 32 45 
8 2 45 31 
9 2 78 31 
10 2 44 31 
11 2 10 31 
+0

非常感謝!它也在工作 – boris

0

這裏是一個矢量NumPy的方法 -

idx = np.searchsorted(df2.G.values, df1.A.values) 
df1['C'] = df2.H.values[idx] 

idx可以用簡單的方法計算:df2.G.searchsorted(df1.A),但不要認爲效率會更高,因爲我們想要使用底層數組和.values來提高性能,就像之前做的那樣。

+0

非常感謝,它也在工作! – boris

+0

@boris確保在你的最後時間。應該很高效:) – Divakar