說我有兩個數據幀。在熊貓中,如何水平連接然後刪除冗餘列
DF1: COL1,COL2,COL3,
DF2:COL2,COL4,COL5
如何水平將兩者連接起來dataframes並有COL1,COL2,COL3,COL4和COL5?現在,我正在做pd.concat([DF1,DF2],axis = 1),但它最終有兩個col2。假設兩個col2中的所有值都是相同的,我想只有一列。
說我有兩個數據幀。在熊貓中,如何水平連接然後刪除冗餘列
DF1: COL1,COL2,COL3,
DF2:COL2,COL4,COL5
如何水平將兩者連接起來dataframes並有COL1,COL2,COL3,COL4和COL5?現在,我正在做pd.concat([DF1,DF2],axis = 1),但它最終有兩個col2。假設兩個col2中的所有值都是相同的,我想只有一列。
丟棄重複應該工作。由於drop_duplicates僅適用於索引,因此我們需要轉置DF以刪除重複項並將其轉回。
pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T
你可以像這樣:
- 首先從DF2
刪除COL2- 然後將兩者連接起來dataframes
使用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
DF2.drop(DF2.columns[DF2.columns.isin(DF1.columns)],axis=1,inplace=True)
然後,
pd.concat([DF1, DF2], axis = 1)
不幸的是很慢的,檢查我的時間安排。 – jezrael