我有一个DataFrame,其中有重复数据但名称不同的列:
In[1]: df
Out[1]:
X1 X2 Y1 Y2
0.0 0.0 6.0 6.0
3.0 3.0 7.1 7.1
7.6 7.6 1.2 1.2
我知道.drop(columns = )可以删除列,但是否有更有效的方法可以不用列出所有要删除的列名呢?请告诉我,因为我可以使用 .drop()。
我有一个DataFrame,其中有重复数据但名称不同的列:
In[1]: df
Out[1]:
X1 X2 Y1 Y2
0.0 0.0 6.0 6.0
3.0 3.0 7.1 7.1
7.6 7.6 1.2 1.2
我知道.drop(columns = )可以删除列,但是否有更有效的方法可以不用列出所有要删除的列名呢?请告诉我,因为我可以使用 .drop()。
我们可以在轴1上使用 np.unique
。不幸的是,pandas没有内置函数来删除重复的列。
df.drop_duplicates
只会移除重复的行。
返回删除了重复行的DataFrame。
我们可以围绕 np.unique
创建一个函数来删除重复的列。
def drop_duplicate_cols(df):
uniq, idxs = np.unique(df, return_index=True, axis=1)
return pd.DataFrame(uniq, index=df.index, columns=df.columns[idxs])
drop_duplicate_cols(X)
X1 Y1
0 0.0 6.0
1 3.0 7.1
2 7.6 1.2
NB:
np.unique
文档:返回数组的排序唯一元素。
解决方法: 为了保留原始顺序,请对
idxs
进行排序。
在拥有多个dtypes
的数据框上使用.T
将会干扰你的实际dtypes
。
df = pd.DataFrame({'A': [0, 1], 'B': ['a', 'b'], 'C': [0, 1], 'D':[2.1, 3.1]})
df.dtypes
A int64
B object
C int64
D float64
dtype: object
df.T.T.dtypes
A object
B object
C object
D object
dtype: object
# To get back original `dtypes` we can use `.astype`
df.T.T.astype(df.dtypes).dtypes
A int64
B object
C int64
D float64
dtype: object
T
和 drop_duplicates
进行转置,然后再转回来:>>> df.T.drop_duplicates().T
X1 Y1
0 0.0 6.0
1 3.0 7.1
2 7.6 1.2
>>>
或使用loc
和duplicated
:
>>> df.loc[:, df.T.duplicated(keep='last')]
X1 Y1
0 0.0 6.0
1 3.0 7.1
2 7.6 1.2
>>>
.T
有一定的開銷。對於 OP 的數據,timeit
測試表明np.unique
快了近8倍。但是我猜np.unique
不會很好地擴展,我在某個地方讀到過這個說法。 - Ch3steR.T
也会改变 dtype。 - Ch3steR