2017-06-14 45 views
3

說我有兩個數據幀。在熊貓中,如何水平連接然後刪除冗餘列

DF1: COL1,COL2,COL3,

DF2:COL2,COL4,COL5

如何水平將兩者連接起來dataframes並有COL1,COL2,COL3,COL4和COL5?現在,我正在做pd.concat([DF1,DF2],axis = 1),但它最終有兩個col2。假設兩個col2中的所有值都是相同的,我想只有一列。

回答

3

丟棄重複應該工作。由於drop_duplicates僅適用於索引,因此我們需要轉置DF以刪除重複項並將其轉回。

pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T 
+0

不幸的是很慢的,檢查我的時間安排。 – jezrael

-2

你可以像這樣:

- 首先從DF2

刪除COL2

- 然後將兩者連接起來dataframes

2

使用difference爲列從DF2其不在DF1和簡單的選擇它們通過[]

DF1 = pd.DataFrame(columns=['col1', 'col2', 'col3']) 
DF2 = pd.DataFrame(columns=['col2', 'col4', 'col5']) 


DF2 = DF2[DF2.columns.difference(DF1.columns)] 
print (DF2) 
Empty DataFrame 
Columns: [col4, col5] 
Index: [] 

print (pd.concat([DF1, DF2], axis = 1)) 
Empty DataFrame 
Columns: [col1, col2, col3, col4, col5] 
Index: [] 

時序

np.random.seed(123) 

N = 1000 
DF1 = pd.DataFrame(np.random.rand(N,3), columns=['col1', 'col2', 'col3']) 
DF2 = pd.DataFrame(np.random.rand(N,3), columns=['col2', 'col4', 'col5']) 

DF2['col2'] = DF1['col2'] 

In [408]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T) 
10 loops, best of 3: 122 ms per loop 

In [409]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1)) 
1000 loops, best of 3: 979 µs per loop 

N = 10000: 
In [411]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T) 
1 loop, best of 3: 1.4 s per loop 

In [412]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1)) 
1000 loops, best of 3: 1.12 ms per loop 
0
DF2.drop(DF2.columns[DF2.columns.isin(DF1.columns)],axis=1,inplace=True) 

然後,

pd.concat([DF1, DF2], axis = 1)