2017-06-15 57 views
4

重复列中的数据假设我有一个表像下面如何删除基于列名大熊猫

A B C B 
0 0 1 2 3 
1 4 5 6 7 

我想删除列B.我试图用drop_duplicate,但它似乎只基于重复的数据而不是标题。 希望任何人都知道如何做到这一点

感谢

回答

7

使用Index.duplicatedlocilocboolean indexing

print (~df.columns.duplicated()) 
[ True True True False] 

df = df.loc[:, ~df.columns.duplicated()] 
print (df) 
    A B C 
0 0 1 2 
1 4 5 6 

df = df.iloc[:, ~df.columns.duplicated()] 
print (df) 
    A B C 
0 0 1 2 
1 4 5 6 

时序

np.random.seed(123) 
cols = ['A','B','C','B'] 
#[1000 rows x 30 columns] 
df = pd.DataFrame(np.random.randint(10, size=(1000,30)),columns = np.random.choice(cols, 30)) 
print (df) 

In [115]: %timeit (df.groupby(level=0, axis=1).first()) 
1000 loops, best of 3: 1.48 ms per loop 

In [116]: %timeit (df.groupby(level=0, axis=1).mean()) 
1000 loops, best of 3: 1.58 ms per loop 

In [117]: %timeit (df.iloc[:, ~df.columns.duplicated()]) 
1000 loops, best of 3: 338 µs per loop 

In [118]: %timeit (df.loc[:, ~df.columns.duplicated()]) 
1000 loops, best of 3: 346 µs per loop 
+1

我肯定会跟你走。这很直观。你立刻得到了我的投票权。我的代码字符少一些,如果你想做其他事情,它会更灵活一些。有用...但我更喜欢你的。 – piRSquared

1

可以groupby
我们使用axis=1level=0参数指定我们被列分组。然后使用first方法获取由唯一列名定义的每个组中的第一列。

df.groupby(level=0, axis=1).first() 

    A B C 
0 0 1 2 
1 4 5 6 

我们也可以使用last

df.groupby(level=0, axis=1).last() 

    A B C 
0 0 3 2 
1 4 7 6 

或者mean

df.groupby(level=0, axis=1).mean() 

    A B C 
0 0 2 2 
1 4 6 6