如何在pandas DataFrame中选择和删除具有重复名称的列

use*_*640 16 python duplicates multiple-columns dataframe pandas

我有一个巨大的DataFrame,有些列有相同的名称.当我尝试选择一个存在两次的列时(例如del df['col name']df2=df['col name'])我得到一个错误.我能做什么?

Rom*_*kar 14

您可以按索引添加列:

>>> 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
Run Code Online (Sandbox Code Playgroud)

或者你可以重命名列,比如

>>> df.columns = ['a','b']
>>> df
   a  b
0  1  2
1  3  4
2  5  6
Run Code Online (Sandbox Code Playgroud)


小智 7

另一种解决方案:

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))
Run Code Online (Sandbox Code Playgroud)

输出是

    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
Run Code Online (Sandbox Code Playgroud)


ely*_*ely 6

这不是一个好的情况。最好是创建一个分层列标签方案(Pandas 允许多级列标签或行索引标签)。确定是什么导致具有相同名称的两个不同列实际上彼此不同,并利用它来创建分层列索引。

同时,如果您知道有序列列表中列的位置(例如,来自dataframe.columns),那么您可以使用许多显式索引功能(例如.ix[]、 或 ).iloc[]从列中按位置检索值。

您还可以使用新名称创建列的副本,例如:

dataframe["new_name"] = data_frame.ix[:, column_position].values
Run Code Online (Sandbox Code Playgroud)

其中column_position引用您尝试获取的列的位置(而不是名称)。

但是,如果数据太大,这些可能对您不起作用。所以最好是想办法修改构造过程来得到分层列索引。