如何在pandas的drop_duplicates中指定前n-1列作为subset参数?
解决DataFrame.drop_duplicates指定前n-1列为subset的问题
嘿,我来帮你搞定这个问题~你之前的代码报错,是因为给subset参数传值的方式不对,咱们一步步来修正:
错误原因
你写的subset=[0:df.shape[1]-1]是无效的Python语法——列表里不能直接使用切片表达式(比如0:xx),subset需要的是列名的列表或者列索引的列表,得把切片转换成实际的列表元素才行。
解决方案
假设我们先构造你给出的示例数据集:
import pandas as pd data = [ [0, 12, 1, 99, 23, 2, 75], [0, 12, 1, 99, 23, 2, 66], [5, 12, 1, 99, 23, 2, 66] ] df = pd.DataFrame(data, columns=[0,1,2,3,4,5,6])
这里总列数是7,我们需要把前6列(也就是除了最后一列之外的所有列)作为去重依据,有两种简单的实现方式:
方法1:用列索引列表
通过range()生成前n-1列的索引,再转换成列表:
df.drop_duplicates(subset=list(range(df.shape[1]-1)), keep='first', inplace=True)
df.shape[1]获取总列数,df.shape[1]-1就是前n-1列的数量,range(df.shape[1]-1)生成0到5的索引序列,转成列表后正好是前6列的索引。
方法2:用列名切片
直接对df.columns(列名序列)做切片,去掉最后一列:
df.drop_duplicates(subset=df.columns[:-1], keep='first', inplace=True)
df.columns[:-1]会返回除了最后一列之外的所有列名,完美符合你要的前n-1列的需求。
验证结果
执行上面任意一种代码后,你的DataFrame会保留索引0和2的行,结果如下:
0 1 2 3 4 5 6 0 0 12 1 99 23 2 75 2 5 12 1 99 23 2 66
完全符合你的预期~
内容的提问来源于stack exchange,提问作者sranga
相关产品推荐
相关产品推荐

