根据具有列表值的多列删除数据框中的重复行
Drop duplicate rows in dataframe based on multplie columns with list values
我有一个包含多列的 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() 但我收到多个错误
您可以将带有列表的每个列转换为 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]
我有一个包含多列的 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() 但我收到多个错误
您可以将带有列表的每个列转换为 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]