如何在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 中的空值

pandas如何删除指定行

导出 pandas DataFrame 时如何删除列名行?

如何从 Python Pandas DataFrame 中的循环结果中删除重复项?

Python之如何删除pandas DataFrame的某一/几列

Pandas Dataframe - 如何检查列中数值的符号,如果为负则删除符号并在发生这种情况时创建另一列?