从熊猫列中的列表中删除重复的对

时间:2020-06-22 05:24:52

标签: python pandas duplicates

在维护订单时,我想从列中的列表中删除重复的对:

例如,输入为:

   cola.   colb
     1.  [sitea,siteb,sitea,siteb;sitec,sited,sitec,sited]

预期输出是每个';'之前的唯一元素。符号

  cola.   colb
     1.  [sitea,siteb;sitec,sited]

我尝试根据;拆分列符号并为该列表创建一个集合,但是没有用。

df['test'] = df.e2etrail.str.split(';').map(lambda x : ','.join(sorted(set(x),key=x.index)))

我还尝试了以下方法

df['test'] = df['e2etrail'].apply(lambda x: list(pd.unique(x)))

关于如何使其工作的任何想法

2 个答案:

答案 0 :(得分:0)

您可以先按条删除[],然后先按,;拆分,然后使用解决方案:

print (df.e2etrail.str.strip('[]').str.split('[;,]'))
dtype: object
0    [sitea, siteb, sitea, siteb, sitec, sited, sit...
Name: e2etrail, dtype: object

f = lambda x : ','.join(sorted(set(x),key=x.index))
df['test'] = df.e2etrail.str.strip('[]').str.split('[;,]').map(f)
print (df)
   cola.                                           e2etrail  \
0    1.0  [sitea,siteb,sitea,siteb;sitec,sited,sitec,sited]   

                      test  
0  sitea,siteb,sitec,sited  

如果需要输出列表:

f = lambda x : sorted(set(x),key=x.index)
df['test'] = df.e2etrail.str.strip('[]').str.split('[;,]').map(f)
print (df)
   cola.                                           e2etrail  \
0    1.0  [sitea,siteb,sitea,siteb;sitec,sited,sitec,sited]   

                           test  
0  [sitea, siteb, sitec, sited]  

答案 1 :(得分:0)

最终,我通过将列表转换为系列来完成此操作,删除了重复项并再次加入系列,如下所示:

        df['e2etrails']=df['e2etrails'].str.split(';')
        df['e2etrails']=df['e2etrails'].apply(lambda row :';'.join(pd.Series(row).str.split(',').map(lambda x : ','.join(sorted(set(x),key=x.index)))))