如何删除pandas中具有不同列名的重复数据?

ahn*_*nni 7 python unique dataframe pandas drop-duplicates

我有一个 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
Run Code Online (Sandbox Code Playgroud)

我知道 .drop(columns = ) 存在,但是有没有一种更有效的方法可以删除它们,而不必列出列名称?或不..请告诉我,因为我可以使用 .drop()

Ch3*_*teR 7

我们可以np.unique在轴 1 上使用。不幸的是,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
Run Code Online (Sandbox Code Playgroud)

Online Demo

注意: np.unique文档:

返回数组中已排序的唯一元素。

解决方法:要保留原始顺序,请对idxs.


.T在具有多个的数据帧上使用dtypes会扰乱您的实际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
Run Code Online (Sandbox Code Playgroud)

  • 这应该更快,因为它在 numpy 数组上使用 numpy 函数,而无需转换形状。+1 (2认同)
  • @anky 谢谢:DI 相信 `.T` 有一定的开销。timeit 比 OP 的数据“np.unique”快了近 8 倍。但是 `np.unique` 的扩展性不好,我想我在某处读到过。 (2认同)
  • @anky 另一个主要缺陷是当 df 具有多种类型时 `.T` 也会更改 dtypes。 (2认同)

U10*_*ard 6

您可以转置Tdrop_duplicates然后转回:

>>> df.T.drop_duplicates().T
    X1   Y1
0  0.0  6.0
1  3.0  7.1
2  7.6  1.2
>>> 
Run Code Online (Sandbox Code Playgroud)

或者与locduplicated

>>> df.loc[:, df.T.duplicated(keep='last')]
    X1   Y1
0  0.0  6.0
1  3.0  7.1
2  7.6  1.2
>>> 
Run Code Online (Sandbox Code Playgroud)