2017-06-14 13 views
3

私は2つのデータフレームがあるとします。パンダでは、水平に連結して冗長列を削除する方法

DF1: COL1、COL2、COL3、

DF2:

COL5 COL2、COL4は、どのようにして水平に2つのデータフレームを連結し、COL1、COL2、COL3、COL4、およびCOL5がありますか?今、私はpd.concat([DF1、DF2]、axis = 1)をやっていますが、2つのcol2を持つことになります。 2つのcol2内のすべての値が同じであると仮定して、私は1つの列しか持たない。

答えて

3

削除重複が動作するはずです。 drop_duplicatesはインデックスでしか機能しないので、DFを転置して重複を削除し、転置する必要があります。

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

は、残念ながらそれは私のタイミングを確認し、非常に遅いです。 – jezrael

-2

あなたがこのように行動することができますすることによって、それらを選択しDF1とシンプルではありませんDF2からの列のための2つのデータフレーム

2

使用differenceを連結-then DF2

からCOL2を削除-first

[]

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) 
関連する問題