如何在pandas中基于列名删除重复的列数据

16

假设我有一个如下的表格

    A   B   C   B
0   0   1   2   3
1   4   5   6   7

我想删除B列。我尝试使用drop_duplicates,但它似乎只基于重复的数据而不是标题工作。 希望有人知道如何做到这一点。

2个回答

34

使用 Index.duplicated 方法与 lociloc 以及布尔索引一起使用:

print (~df.columns.duplicated())
[ True  True  True False]

df = df.loc[:, ~df.columns.duplicated()]
print (df)
   A  B  C
0  0  1  2
1  4  5  6

df = df.iloc[:, ~df.columns.duplicated()]
print (df)
   A  B  C
0  0  1  2
1  4  5  6

时间

np.random.seed(123)
cols = ['A','B','C','B']
#[1000 rows x 30 columns]
df = pd.DataFrame(np.random.randint(10, size=(1000,30)),columns = np.random.choice(cols, 30))
print (df)

In [115]: %timeit (df.groupby(level=0, axis=1).first())
1000 loops, best of 3: 1.48 ms per loop

In [116]: %timeit (df.groupby(level=0, axis=1).mean())
1000 loops, best of 3: 1.58 ms per loop

In [117]: %timeit (df.iloc[:, ~df.columns.duplicated()])
1000 loops, best of 3: 338 µs per loop

In [118]: %timeit (df.loc[:, ~df.columns.duplicated()])
1000 loops, best of 3: 346 µs per loop

在此输入图片描述

在此输入图片描述


2
我肯定会选择你的。它很直观。你立刻得到了我的赞成票。我的代码字符稍微少一些,如果你想做其他事情,它也更加灵活。有用...但我更喜欢你的。 - piRSquared
发现了这个旧问题,我正在尝试一个新的函数来评估不同的时间。你觉得怎么样? - Anton vBR
@AntonvBR - 非常感谢你! :) - jezrael

5
你可以使用 groupby 进行分组。
我们使用 axis=1level=0 参数来指定我们正在按列进行分组。然后使用 first 方法来获取由唯一列名定义的每个组中的第一列。
df.groupby(level=0, axis=1).first()

   A  B  C
0  0  1  2
1  4  5  6

我们也可以使用last
df.groupby(level=0, axis=1).last()

   A  B  C
0  0  3  2
1  4  7  6

或者 平均值
df.groupby(level=0, axis=1).mean()

   A  B  C
0  0  2  2
1  4  6  6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接