删除pandas.Dataframe中重复列的快速方法

Pet*_*uke 6 python pandas

所以通过使用

df_ab = pd.concat([df_a, df_b], axis=1, join='inner')
Run Code Online (Sandbox Code Playgroud)

我得到一个这样的Dataframe:

    A    A    B    B
0   5    5   10   10
1   6    6   19   19
Run Code Online (Sandbox Code Playgroud)

我想删除它的多个列:

    A     B
0   5    10
1   6    19
Run Code Online (Sandbox Code Playgroud)

因为df_a和df_b是同一个Dataframe的子集,所以我知道如果列名相同,所有行都具有相同的值.我有一个有效的解决方案:

df_ab = df_ab.T.drop_duplicates().T
Run Code Online (Sandbox Code Playgroud)

但是我有很多行,所以这个很慢.有人有更快的解决方案吗?我更喜欢一种不需要明确知道列名的解决方案.

Pra*_*iel 18

最简单的方法是:

df = df.loc[:,~df.columns.duplicated()]
Run Code Online (Sandbox Code Playgroud)

一行代码可以改变一切

  • 这应该是经过验证的答案,因为并非所有列始终都必须完全相同 (2认同)

unu*_*tbu 11

也许你最好完全避免这个问题,使用pd.merge代替pd.concat

df_ab = pd.merge(df_a, df_b, how='inner')
Run Code Online (Sandbox Code Playgroud)

这将合并df_a,并df_b在所有列在共同分享。

  • 尽管 concat 一次可能需要两个以上。 (2认同)

beh*_*uri 8

您可以使用np.unique来获取唯一列的索引,然后使用.iloc

>>> df
   A  A   B   B
0  5  5  10  10
1  6  6  19  19
>>> _, i = np.unique(df.columns, return_index=True)
>>> df.iloc[:, i]
   A   B
0  5  10
1  6  19
Run Code Online (Sandbox Code Playgroud)


Jam*_*ght 7

对于那些跳过问题直接看答案的人,对我来说最简单的方法是使用 OP 的解决方案(假设您没有遇到他所做的相同的性能问题:转置数据帧,使用 drop_duplicates,然后再次转置它:

df.T.drop_duplicates().T
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但非常慢。@Prayson W. Daniel 的回答只是速度的一小部分。 (3认同)