问题描述
我有一个看起来像这样的数据框:
id events
1 [a]
1 [a,b,c,d]
2 [d,e]
2 [d,e,f]
我想消除后续各行中的常见项目。导致:
id events
1 [a]
1 [b,d]
2 [d,e]
2 [f]
我知道set函数是在列级别执行的,但是是否可以使用apply或lambda函数在一行上递归执行此操作?
解决方法
一个想法是使用DataFrame.explode
,用DataFrame.drop_duplicates
删除两列的重复项,然后聚合回去:
df = (df.explode('events')
.drop_duplicates(['id','events'])
.groupby(level=0)
.agg({'id':'first','events':list}))
print (df)
id events
0 1 [a]
1 1 [b,c,d]
2 2 [d,e]
3 2 [f]
,
我能够使用apply和全局列表来做到这一点
list_ = []
def filterList (X):
result = []
for x in X:
if not x in list_:
list_.append (x)
result.append (x)
return result
df ['event'].apply (lambda x: filterList(x))