如何在pandas DataFrame中选择和删除具有重复名称的列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在pandas DataFrame中选择和删除具有重复名称的列相关的知识,希望对你有一定的参考价值。
我有一个巨大的DataFrame
,其中一些列具有相同的名称。当我尝试选择一个存在两次的列时(例如del df['col name']
或df2=df['col name']
)我收到错误。我能做什么?
您可以按索引寻址列:
>>> df = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['a','a'])
>>> df
a a
0 1 2
1 3 4
2 5 6
>>> df.iloc[:,0]
0 1
1 3
2 5
或者你可以重命名列,比如
>>> df.columns = ['a','b']
>>> df
a b
0 1 2
1 3 4
2 5 6
这不是一个好的情况。最好是创建一个分层列标签方案(Pandas允许多级列标签或行索引标签)。确定使两个具有相同名称的不同列实际上彼此不同的内容,并利用它来创建分层列索引。
同时,如果您知道列的有序列表中列的位置(例如,来自dataframe.columns
),那么您可以使用许多显式索引功能,例如.ix[]
或.iloc[]
来从列位置检索值。
您还可以使用新名称创建列的副本,例如:
dataframe["new_name"] = data_frame.ix[:, column_position].values
其中column_position
引用了您要获取的列的位置位置(而不是名称)。
但是,如果数据太大,这些可能对您不起作用。所以最好是找到一种方法来修改构造过程以获得分层列索引。
另一种方案:
def remove_dup_columns(frame):
keep_names = set()
keep_icols = list()
for icol, name in enumerate(frame.columns):
if name not in keep_names:
keep_names.add(name)
keep_icols.append(icol)
return frame.iloc[:, keep_icols]
import numpy as np
import pandas as pd
frame = pd.DataFrame(np.random.randint(0, 50, (5, 4)), columns=['A', 'A', 'B', 'B'])
print(frame)
print(remove_dup_columns(frame))
输出是
A A B B
0 18 44 13 47
1 41 19 35 28
2 49 0 30 16
3 39 29 43 41
4 26 19 48 13
A B
0 18 13
1 41 35
2 49 30
3 39 43
4 26 48
以下函数删除具有dublicate名称的列,并仅保留一个。不完全是你要求的,但你可以使用它来解决你的问题。想法是返回索引号,然后您可以直接对特定的列索引进行处理。索引是唯一的,而列名不是
def remove_multiples(df,varname):
"""
makes a copy of the first column of all columns with the same name,
deletes all columns with that name and inserts the first column again
"""
from copy import deepcopy
dfout = deepcopy(df)
if (varname in dfout.columns):
tmp = dfout.iloc[:, min([i for i,x in enumerate(dfout.columns == varname) if x])]
del dfout[varname]
dfout[varname] = tmp
return dfout
哪里
[i for i,x in enumerate(dfout.columns == varname) if x]
是你需要的部分
以上是关于如何在pandas DataFrame中选择和删除具有重复名称的列的主要内容,如果未能解决你的问题,请参考以下文章
如何从列类型列表中删除 pandas DataFrame 中的空值
如何从 Python Pandas DataFrame 中的循环结果中删除重复项?