Pandas通过索引删除列会删除所有同名列

21

考虑以下数据框,它具有相同名称的列(显然会发生这种情况,我目前有一个这样的数据集! :()

>>> df = pd.DataFrame({"a":range(10,15),"b":range(5,10)})
>>> df.rename(columns={"b":"a"},inplace=True)
df

    a   a
0   10  5
1   11  6
2   12  7
3   13  8
4   14  9

>>> df.columns
Index(['a', 'a'], dtype='object')

我原以为按索引值删除列时,只有具有相应索引的列会被删除,但显然情况并非如此。

>>> df.drop(df.columns[-1],1)

0
1
2
3
4

有没有办法消除具有重复列名的列?

编辑:我选择了第一列误导性的值,已经修正。

编辑2:预期结果为

  a
0 10
1 11
2 12 
3 13
4 14

事实上,我传入了1来删除列。我还得到了一个空的数据框(01234是索引)。我只是期望能够摆脱第二个(最后一个,包含值5到9,因此为-1)列,而数据框不会变为空,而是有索引0到4和值0到4。对于选择"a"列的误导性值表示抱歉。 - redacted
@Pocin “有没有办法去除具有重复列名的列?” 所有列都有重复的名称,你已经将它们删除了,还想做什么? - Stop harming Monica
我的错,今天不是我的日子。在编辑中,我添加了预期的结果。混淆的原因在于,如果我想要摆脱所有重复名称的列,我会使用 df.drop("a",1)。我想通过使用整数列索引来绕过这个问题,但它产生了与 df.drop("a",1) 相同的效果。 - redacted
1个回答

26

实际上只需这样做:

In [183]:
df.ix[:,~df.columns.duplicated()]

Out[183]:
   a
0  0
1  1
2  2
3  3
4  4

因此,此索引对所有行进行索引,然后使用从 duplicated 生成的列掩码,并使用~反转掩码。

duplicated的输出:

In [184]:
df.columns.duplicated()

Out[184]:
array([False,  True], dtype=bool)

更新

由于自版本0.20.1以来.ix已被弃用,因此您应执行以下任一操作:

df.iloc[:,~df.columns.duplicated()]
或者
df.loc[:,~df.columns.duplicated()]

感谢@DavideFiocco提醒我


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