从数据框架中删除重复列的最简单方法是什么?

我正在阅读一个文本文件,通过重复的列:

import pandas as pd

df=pd.read_table(fname)

列名为:

Time, Time Relative, N2, Time, Time Relative, H2, etc...

所有“时间”和“时间相对”列包含相同的数据。我想要:

Time, Time Relative, N2, H2

我所有的尝试删除,删除等,如:

df=df.T.drop_duplicates().T

导致唯一值的索引错误:

Reindexing only valid with uniquely valued index objects

对不起,我是熊猫的菜鸟。任何建议将不胜感激。


额外的细节

熊猫版本:0.9.0 Python版本:2.7.3 Windows 7 (通过Pythonxy 2.7.3.0安装)

数据文件(注:在实际文件中,列之间以制表符分隔,此处以4个空格分隔):

Time    Time Relative [s]    N2[%]    Time    Time Relative [s]    H2[ppm]
2/12/2013 9:20:55 AM    6.177    9.99268e+001    2/12/2013 9:20:55 AM    6.177    3.216293e-005    
2/12/2013 9:21:06 AM    17.689    9.99296e+001    2/12/2013 9:21:06 AM    17.689    3.841667e-005    
2/12/2013 9:21:18 AM    29.186    9.992954e+001    2/12/2013 9:21:18 AM    29.186    3.880365e-005    
... etc ...
2/12/2013 2:12:44 PM    17515.269    9.991756+001    2/12/2013 2:12:44 PM    17515.269    2.800279e-005    
2/12/2013 2:12:55 PM    17526.769    9.991754e+001    2/12/2013 2:12:55 PM    17526.769    2.880386e-005
2/12/2013 2:13:07 PM    17538.273    9.991797e+001    2/12/2013 2:13:07 PM    17538.273    3.131447e-005

当前回答

如果您想检查重复的列,这段代码可能很有用

columns_to_drop= []

for cname in sorted(list(df)):
    for cname2 in sorted(list(df))[::-1]:
        if df[cname].equals(df[cname2]) and cname!=cname2 and cname not in columns_to_drop:
            columns_to_drop.append(cname2)
            print(cname,cname2,'Are equal')

df = df.drop(columns_to_drop, axis=1)

其他回答

下面的方法将识别dupe列,以检查最初构建数据框架时出错的地方。

dupes = pd.DataFrame(df.columns)
dupes[dupes.duplicated()]

简单的列比较是按值检查重复列的最有效方法(就内存和时间而言)。这里有一个例子:

import numpy as np
import pandas as pd
from itertools import combinations as combi

df = pd.DataFrame(np.random.uniform(0,1, (100,4)), columns=['a','b','c','d'])
df['a'] = df['d'].copy()  # column 'a' is equal to column 'd'

# to keep the first
dupli_cols = [cc[1] for cc in combi(df.columns, r=2) if (df[cc[0]] == df[cc[1]]).all()]

# to keep the last
dupli_cols = [cc[0] for cc in combi(df.columns, r=2) if (df[cc[0]] == df[cc[1]]).all()]
            
df = df.drop(columns=dupli_cols)

如果您想检查重复的列,这段代码可能很有用

columns_to_drop= []

for cname in sorted(list(df)):
    for cname2 in sorted(list(df))[::-1]:
        if df[cname].equals(df[cname2]) and cname!=cname2 and cname not in columns_to_drop:
            columns_to_drop.append(cname2)
            print(cname,cname2,'Are equal')

df = df.drop(columns_to_drop, axis=1)

快速和简单的方法删除复制列的值:

df = df.T.drop_duplicates().T

更多信息:Pandas DataFrame drop_duplicate manual。

看来你的选择是对的。这是你一直在寻找的一句俏皮话:

df.reset_index().T.drop_duplicates().T

但是,由于没有示例数据帧产生引用错误消息,仅对唯一值的索引对象进行有效的重新索引,因此很难确切地说什么可以解决这个问题。如果恢复原始索引对你来说很重要,那么这样做:

original_index = df.index.names
df.reset_index().T.drop_duplicates().reset_index(original_index).T