私は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つの列しか持たない。
私は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つの列しか持たない。
削除重複が動作するはずです。 drop_duplicatesはインデックスでしか機能しないので、DFを転置して重複を削除し、転置する必要があります。
pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T
あなたがこのように行動することができますすることによって、それらを選択しDF1
とシンプルではありませんDF2
からの列のための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
DF2.drop(DF2.columns[DF2.columns.isin(DF1.columns)],axis=1,inplace=True)
その後、
pd.concat([DF1, DF2], axis = 1)
は、残念ながらそれは私のタイミングを確認し、非常に遅いです。 – jezrael