如何使用具有相同标签的列从数据框中删除列?

时间:2015-11-07 17:56:43

标签: python pandas dataframe

我有一个数据框,其中一些列标签出现多次(即,某些列具有相同的标签)。这引起了我的问题 - 我可能会单独发布更多相关信息,因为有些行为似乎有些奇怪,但在这里我只是想问一下删除其中的一些列。也就是说,对于多次出现的每个列标签,我想删除它前面的第一列以外的所有列。这是一个例子:

In [5]: arr = np.array([[0.0, 1.0, 2.0, 3.0], [4.0, 5.0, 6.0, 7.0]])

In [6]: df = pd.DataFrame(data=arr, columns=['A', 'C', 'E', 'A'])

In [7]: df
Out[7]:
   A  C  E  A
0  0  1  2  3
1  4  5  6  7

如果我使用标签删除列,则删除以该标签为首的所有列:

In [9]: df.drop('A', axis=1)
Out[9]:
   C  E
0  1  2
1  5  6

所以我想我会尝试删除列索引,但这也删除了该标签所有的列:

In [12]: df.drop(df.columns[3], axis=1)
Out[12]:
   C  E
0  1  2
1  5  6

我如何做我想要的,也就是说,对于每个这样的标签,删除除了其中一列之外的所有标签?对于上面的例子,我想最终得到:

   A  C  E
0  0  1  2
1  4  5  6

现在我已经重新标记了列,如下所示:

columns = {}
new_columns = []
duplicate_num = 0
for n in df.columns:
    if n in columns:
        new_columns.append("duplicate%d" % (duplicate_num))
        duplicate_num += 1
    else:
        columns[n] = 1
        new_columns.append(n)
df.columns = new_columns

这适用于我的需求,但它似乎不是最好/最干净的解决方案。感谢。

编辑:我不知道这是如何与另一个问题重复。首先,它处理重复的列,而不是重复的列标签。另一方面,建议的解决方案涉及转置数据帧(两次),但如上所述,转置大型数据帧效率低下,事实上我正在处理大型数据帧。

1 个答案:

答案 0 :(得分:5)

In [18]:  
df.ix[: , ~df.columns.duplicated()]
Out[18]:
    A   C   E
0   0   1   2
1   4   5   6

说明

In [19]:
~df.columns.duplicated()
Out[19]:
array([ True,  True,  True, False], dtype=bool)

正如您在此处所见,首先需要检查列名是否重复,请注意我在函数开头添加了~。 然后,您可以使用非重复值

对列进行切片