基于具有列表值的多列删除数据框中的重复行[重复]

Posted

技术标签:

【中文标题】基于具有列表值的多列删除数据框中的重复行[重复]【英文标题】:Drop duplicate rows in dataframe based on multplie columns with list values [duplicate] 【发布时间】:2021-04-28 22:03:50 【问题描述】:

我有包含多列的 DataFrame,而少数列包含列表值。通过只考虑其中包含列表值的列,必须删除重复的行。

当前数据框:

ID    col1            col2            col3            col4
1     52         [kjd,pkh,sws]    [aqs,zxc,asd]   [plm,okn,ijb]
2     47         [qaz,wsx,edc]    [aws,rfc,tgb]   [rty,wer,dfg]
3     85         [kjd,pkh,sws]    [aqs,zxc,asd]   [plm,okn,ijb]
4     27         [asw,bxs,mdh]    [wka,kdy,kaw]   [pqm,lsc,yhb]

期望的输出:

ID    col1            col2            col3            col4
2     47         [qaz,wsx,edc]    [aws,rfc,tgb]   [rty,wer,dfg]
4     27         [asw,bxs,mdh]    [wka,kdy,kaw]   [pqm,lsc,yhb]

我尝试将其转换为元组并应用 df.drop_duplicates() 但出现多个错误

【问题讨论】:

不,我已经试过了。由于我在列值中有 List 它会产生错误 drop_duplicates 适用于您为我提供的示例。如果您仍然遇到问题,只需编辑您的帖子,详细了解您在drop_duplicates 遇到的问题。 我认为作为答案提到的帖子不是这个问题的真正答案,而这篇帖子是答案:***.com/a/52949875/7206701 重复列表中的元素顺序会改变吗? @HooriM。这个答案将单列转换为元组,但我的问题有三列包含列表值 【参考方案1】:

您可以将每个带有列表的列转换为 str,然后删除重复项。

第 1 步:将包含列表的每一列转换为字符串类型 astype(str)。 第 2 步:使用drop_duplicates 将列作为字符串。自从你 要删除所有重复项,请设置keep=False。 第 3 步:删除临时创建的 astype(str) 列,因为您不再 需要它们。

完整的代码是:

c = ['col1','col2','col3','col4']
d =[[52,['kjd','pkh','sws'],['aqs','zxc','asd'],['plm','okn','ijb']],
    [47,['qaz','wsx','edc'],['aws','rfc','tgb'],['rty','wer','dfg']],
    [85,['kjd','pkh','sws'],['aqs','zxc','asd'],['plm','okn','ijb']],
    [27,['asw','bxs','mdh'],['wka','kdy','kaw'],['pqm','lsc','yhb']]]

import pandas as pd
df = pd.DataFrame(d,columns=c)
print(df)

df['col2s'] = df['col2'].astype(str)
df['col3s'] = df['col3'].astype(str)
df['col4s'] = df['col4'].astype(str)

df.drop_duplicates(subset=['col2s', 'col3s','col4s'],keep=False,inplace=True)
df.drop(['col2s', 'col3s','col4s'],axis=1,inplace=True)
print (df)

这个输出将是:

原始数据框:

   col1             col2             col3             col4
0    52  [kjd, pkh, sws]  [aqs, zxc, asd]  [plm, okn, ijb]
1    47  [qaz, wsx, edc]  [aws, rfc, tgb]  [rty, wer, dfg]
2    85  [kjd, pkh, sws]  [aqs, zxc, asd]  [plm, okn, ijb]
3    27  [asw, bxs, mdh]  [wka, kdy, kaw]  [pqm, lsc, yhb]

删除重复项后的DataFrame:

   col1             col2             col3             col4
1    47  [qaz, wsx, edc]  [aws, rfc, tgb]  [rty, wer, dfg]
3    27  [asw, bxs, mdh]  [wka, kdy, kaw]  [pqm, lsc, yhb]

【讨论】:

以上是关于基于具有列表值的多列删除数据框中的重复行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列列表从数据框中删除多列[重复]

删除熊猫数据框中具有特定值的行[重复]

在python数据框中删除不包含列中特定字符串的多列的重复项

删除另一个数据框中的行[重复]

如果值在列表中,则 Pandas 数据框中的重复行

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python