2013-12-16 52 views
21

這可能是容易的,但我有以下數據:追加列大熊貓數據幀

在數據幀1:

index dat1 
0  9 
1  5 

在數據幀2:

index dat2 
0  7 
1  6 

我想具有以下形式的數據幀:

index dat1 dat2 
0  9  7 
1  5  6 

我試過使用append方法,但我得到了一個交叉連接(即笛卡爾積)。

什麼是正確的方法來做到這一點?

+2

你嘗試了'join'方法? – BrenBarn

+0

data_frame_1 ['dat2'] = data_frame_2 ['dat2'] – lowtech

+0

@lowtech:這是否確保索引正確配對? – BenDundee

回答

37

看來一般你只是在尋找一個聯接:

> dat1 = pd.DataFrame({'dat1': [9,5]}) 
> dat2 = pd.DataFrame({'dat2': [7,6]}) 
> dat1.join(dat2) 
    dat1 dat2 
0  9  7 
1  5  6 
+3

或者'pd.concat([dat1,dat2],axis = 1)'在這種情況下。 – DSM

+0

這是「正確」的方式來做到這一點,所以圈子得到廣場! – BenDundee

+0

@BenDundee Join和concat使用了很多相同的代碼,所以當你考慮邊緣情況時,「正確」的方式可能只是很重要。例如,如果這兩個DataFrame都有一個'data'列,那麼連接會失敗*,而concat會給你兩個名爲'data'的列。 – U2EF1

1

恰到好處的谷歌搜索的問題:

data = dat_1.append(dat_2) 
data = data.groupby(data.index).sum() 
+11

這個頁面是谷歌搜索出現的。 – denson

13

您還可以使用:

dat1 = pd.concat([dat1, dat2], axis=1) 
5

join()和concat()方式都可以解決這個問題。但是,我必須提到一個警告:如果嘗試通過從另一個DataFrame中選擇一些行來處理某些數據幀,請在重新加入連接或concat之前重置索引。下面

一個例子顯示的加入,CONCAT一些有趣的行爲:

dat1 = pd.DataFrame({'dat1': range(4)}) 
dat2 = pd.DataFrame({'dat2': range(4,8)}) 
dat1.index = [1,3,5,7] 
dat2.index = [2,4,6,8] 

# way1 join 2 DataFrames 
print(dat1.join(dat2)) 
# output 
    dat1 dat2 
1  0 NaN 
3  1 NaN 
5  2 NaN 
7  3 NaN 

# way2 concat 2 DataFrames 
print(pd.concat([dat1,dat2],axis=1)) 
#output 
    dat1 dat2 
1 0.0 NaN 
2 NaN 4.0 
3 1.0 NaN 
4 NaN 5.0 
5 2.0 NaN 
6 NaN 6.0 
7 3.0 NaN 
8 NaN 7.0 

#reset index 
dat1 = dat1.reset_index(drop=True) 
dat2 = dat2.reset_index(drop=True) 
#both 2 ways to get the same result 

print(dat1.join(dat2)) 
    dat1 dat2 
0  0  4 
1  1  5 
2  2  6 
3  3  7 


print(pd.concat([dat1,dat2],axis=1)) 
    dat1 dat2 
0  0  4 
1  1  5 
2  2  6 
3  3  7 
+0

那麼說好點。我嘗試不重置索引並生成了很多NULLS – Anand