我有一个大型数据框(超过100列,数十万行),其中一些行包含重复的数据。我正在尝试删除重复行,保留具有不同列中最大值的行。
基本上,我正在根据时间段将数据分成单独的容器,因此在跨时间段时,预计会发现很多重复项,因为大多数实体存在于所有时间段中。然而,不能允许同一实体在给定时间段内出现超过一次。
我尝试了Python Pandas:按列A删除重复项,保留列B中具有最高值的行中的方法,使用数据子集,并计划重新组合原始数据框df。
数据子集示例:
我最终做了以下操作,这种方法更加冗长且难看,并且只保留一个重复的值,但是这也非常慢!考虑到其他类似复杂度的操作的速度,我想在这里寻求更好的解决方案。
因此,我的请求实际上是修复上述代码,使其更快。下面提供了一些指导,如果与下面的方法相同,也许我可以根据索引丢弃重复项,而不是采用我所采用的reset_index/set_index方法。
基本上,我正在根据时间段将数据分成单独的容器,因此在跨时间段时,预计会发现很多重复项,因为大多数实体存在于所有时间段中。然而,不能允许同一实体在给定时间段内出现超过一次。
我尝试了Python Pandas:按列A删除重复项,保留列B中具有最高值的行中的方法,使用数据子集,并计划重新组合原始数据框df。
数据子集示例:
unique_id period_id liq
index
19 CAN00CE0 199001 0.017610
1903 **USA07WG0** 199001 1.726374
12404 **USA07WG0** 199001 0.090525
13330 USA08DE0 199001 1.397143
14090 USA04U80 199001 2.000716
12404 USA07WG0 199002 0.090525
13330 USA08DE0 199002 1.397143
14090 USA04U80 199002 2.000716
在上面的例子中,我想保留第一个实例(因为liq高达1.72),并且舍弃第二个实例(liq较低,仅0.09)。请注意,在给定的period_id中可能有多个重复项。
我尝试过以下方法,但它对于我来说非常慢(5分钟后我停止了它):
def h(x):
x = x.dropna() #idmax fails on nas, and happy to throw out where liq is na.
return x.ix[x.liq.idmax()]
df.groupby([‘holt_unique_id’, ‘period_id’], group_keys = False).apply(lambda x: h(x))
我最终做了以下操作,这种方法更加冗长且难看,并且只保留一个重复的值,但是这也非常慢!考虑到其他类似复杂度的操作的速度,我想在这里寻求更好的解决方案。
因此,我的请求实际上是修复上述代码,使其更快。下面提供了一些指导,如果与下面的方法相同,也许我可以根据索引丢弃重复项,而不是采用我所采用的reset_index/set_index方法。
def do_remove_duplicates(df):
sub_df = df[['period_id', 'unique_id']]
grp = sub_df.groupby(['period_id', 'unique_id'], as_index = False)
cln = grp.apply(lambda x: x.drop_duplicates(cols = 'unique_id')) #apply drop_duplicates. This line is the slow bit!
cln = cln.reset_index() #remove the index stuff that has been added
del(cln['level_0']) #remove the index stuff that has been added
cln.set_index('level_1', inplace = True) #set the index back to the original (same as df).
df_cln = cln.join(df, how = 'left', rsuffix = '_right') # join the cleaned dataframe with the original, discarding the duplicate rows using a left join.
return df_cln