在同一数据框中递归使用set函数

问题描述

我有一个看起来像这样的数据框:

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))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...