在维护订单时,我想从列中的列表中删除重复的对:
例如,输入为:
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)))
关于如何使其工作的任何想法
答案 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)))))