【问题标题】:Remove consecutive duplicate entries from pandas in each cell从每个单元格中的 pandas 中删除连续的重复条目
【发布时间】:2019-12-24 20:31:15
【问题描述】:

我有一个看起来像

的数据框
d = {'col1': ['a,a,b', 'a,c,c,b'], 'col2': ['a,a,b', 'a,b,b,a']}
pd.DataFrame(data=d)

预期输出

d={'col1':['a,b','a,c,b'],'col2':['a,b','a,b,a']}

我试过这样:

arr = ['a', 'a', 'b', 'a', 'a', 'c','c']
print([x[0] for x in groupby(arr)])

如何删除数据框每一行每一列中的重复条目?

a,a,b,c 应该是a,b,c

【问题讨论】:

    标签: python-3.x pandas pandas-groupby


    【解决方案1】:

    据我了解,您不想包含按顺序重复的值,您可以尝试使用此自定义函数:

    def myfunc(x):
        s=pd.Series(x.split(','))
        res=s[s.ne(s.shift())]
        return ','.join(res.values)
    
    print(df.applymap(myfunc))
    

        col1   col2
    0    a,b    a,b
    1  a,c,b  a,b,a
    

    可以使用itertools.groupby 创建另一个函数,例如:

    from itertools import groupby
    def myfunc(x):
        l=[x[0] for x in groupby(x.split(','))]
        return ','.join(l)
    

    【讨论】:

    • 太相似了。让我删。好答案。 +1
    • 我很高兴我的想法和你一样。 :) @ScottBoston :)
    【解决方案2】:

    您可以定义一个函数来帮助解决此问题,然后使用 .applymap 将其应用于所有列(或一次 .apply 一列):

    d = {'col1': ['a,a,b', 'a,c,c,b'], 'col2': ['a,a,b', 'a,b,b,a']}
    df = pd.DataFrame(data=d)
    
    def remove_dups(string):
        split = string.split(',')  # split string into a list
        uniques = set(split)       # remove duplicate list elements
        return ','.join(uniques)   # rejoin the list elements into a string
    
    result = df.applymap(remove_dups)
    

    这会返回:

        col1 col2
    0    a,b  a,b
    1  a,c,b  a,b
    

    编辑:这看起来与您的预期输出略有不同,为什么您希望 col2 中的第二行出现 a、b、a?

    Edit2:为了保留原始顺序,可以将 set() 函数替换为 unique_everseen()

    from more_itertools import unique_everseen
    

    。 . .

    uniques = unique_everseen(split)
    

    【讨论】:

    • a,b,c,c 应该是 a,b,c 函数的顺序不正确。
    • 如果需要,我已按答案编辑,让您保留原始订单。
    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2017-09-20
    • 2021-05-05
    • 2019-11-29
    相关资源
    最近更新 更多