我有一个数据框,其中一些列标签出现多次(即,一些列具有相同的标签).这引起了我的问题 – 我可能会单独发布更多相关信息,因为有些行为似乎有些奇怪,但在这里我只是想问一下删除其中的一些列.也就是说,对于多次出现的每个列标签,我想删除它前面的第一列以外的所有列.这是一个例子:
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
这对我的需求很好,但它似乎不是最好/最干净的解决方案.谢谢.
编辑:我不知道这是如何与另一个问题重复.首先,它处理重复的列,而不是重复的列标签.另一方面,建议的解决方案涉及转置数据帧(两次),但如上所述,转置大型数据帧效率低下,事实上我正在处理大型数据帧.
解决方法:
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)
正如你在这里看到的,你需要先检查列名是否重复,注意我在函数的开头添加了〜.
然后,您可以使用非重复值对列进行切片
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。