这是一个基于重复项删除列的单行解决方案列名:
df = df.loc[:,~df.columns.duplicated()].copy()
怎么运行的:
假设数据框的列是['alpha','beta','alpha']
df.columns.duplicated()
返回一个布尔数组:aTrue
or False
对于每一列。如果是False
那么到那时为止,列名是唯一的,如果是True
那么列名会先重复。例如,使用给定的示例,返回值将是[False,False,True]
.
Pandas
允许使用布尔值进行索引,从而仅选择True
价值观。由于我们想要保留不重复的列,因此我们需要翻转上面的布尔数组(即[True, True, False] = ~[False,False,True]
)
最后,df.loc[:,[True,True,False]]
使用上述索引功能仅选择非重复列。
决赛.copy()
是否可以复制数据帧(主要是)避免稍后尝试修改现有数据帧时出现错误。
Note:上面仅检查列名称,not列值。
删除重复索引
由于它足够相似,因此对索引执行相同的操作:
df = df.loc[~df.index.duplicated(),:].copy()
通过检查值而不转置来删除重复项
更新和警告: 请谨慎使用。根据 DrWhat 在评论中提供的反例,该解决方案可能not在所有情况下都能达到预期的结果。
df = df.loc[:,~df.apply(lambda x: x.duplicated(),axis=1).all()].copy()
这避免了转置的问题。快吗?不,有效果吗?在某些情况下。在这里,尝试一下:
# create a large(ish) dataframe
ldf = pd.DataFrame(np.random.randint(0,100,size= (736334,1312)))
#to see size in gigs
#ldf.memory_usage().sum()/1e9 #it's about 3 gigs
# duplicate a column
ldf.loc[:,'dup'] = ldf.loc[:,101]
# take out duplicated columns by values
ldf = ldf.loc[:,~ldf.apply(lambda x: x.duplicated(),axis=1).all()].copy()