Python 是否删除熊猫中字符串列中的重复字符?

Python 是否删除熊猫中字符串列中的重复字符?,python,pandas,Python,Pandas,例如,在A行中;AC=a,a;AD=E;AE=W;AF=u,u;AG=Q;AH=R,重复出现“a”和“u” 所需的输出是一个;AC=a;AD=E;AE=W;AF=u;AG=Q;AH=R “信息”栏中重复的单词很难纠正。我需要删除逗号和后面的字符 这是数据帧: df = pd.DataFrame([['A','B','C','A;AC=a,a;AD=E;AE=W;AF=u,u;AG=Q;AH=R','F','G'], ['h','k','J','AB=k;AC=

例如,在A行中;AC=a,a;AD=E;AE=W;AF=u,u;AG=Q;AH=R,重复出现“a”和“u”

所需的输出是一个;AC=a;AD=E;AE=W;AF=u;AG=Q;AH=R

“信息”栏中重复的单词很难纠正。我需要删除逗号和后面的字符

这是数据帧:

df = pd.DataFrame([['A','B','C','A;AC=a,a;AD=E;AE=W;AF=u,u;AG=Q;AH=R','F','G'],
                  ['h','k','J','AB=k;AC=5,5;AD=E;AF=W;AG=y,y;AH=Q','L','M'],['O','P','Q','AC=k;AD=e;AE=E;AF=W;AG=y;AH=Q;AK=R','S','T'],
                  ['U','V','W','AC=a;AD=b;AE=r;AF=y;AG=Q;AH=R','Y','Z'],['U','V','W','AC=a;AD=b;AE=r,r;AF=y;AG=Q;AH=R','Y','Z']], columns = ['Col1','Col2','Col3','info','col4','col5'])
我们得到这个结果作为图表

例如,我们在“信息”列中看到,AC=a,a有一个重复的a。我们需要先删除一个逗号,然后再删除逗号。在同一列中,有AF=u,u,u字符也重复,我们需要删除u及其逗号;AD=E;AF=W;AG=y,y,这里还有两个字符5,y和它们的逗号

这是所需结果的图表


那么如何获得最终结果呢?

您可以尝试regex back reference:

# \1 refers to the previously capture group
# updated
pattern = r'([^=,]+),(\1)'
# if you have more than two instances, e.g. a,a,a
# use
# pattern = r'([^=,]+),(\1)'


df['info'] = df['info'].str.replace(pattern, r'\1')
输出:

  Col1 Col2 Col3                                 info col4 col5
0    A    B    C  A;AC=a;AD=E;AE=W;AF=0.500;AG=Q;AH=R    F    G
1    h    k    J        AB=k;AC=5;AD=E;AF=W;AG=y;AH=Q    L    M
2    O    P    Q   AC=k;AD=e;AE=E;AF=W;AG=y;AH=Q;AK=R    S    T
3    U    V    W        AC=a;AD=b;AE=r;AF=y;AG=Q;AH=R    Y    Z
4    U    V    W        AC=a;AD=b;AE=r;AF=y;AG=Q;AH=R    Y    Z

Regex.sub也会这样做

import regex as re
df['info'] = [re.sub(r'(.),\1', r'\1', x) for x in df['info'] ]
df
在这个表达式中。使用一个字符引用任何字符组,然后使用逗号,然后\1再次引用同一字符组。因此,我们在角色中加入符合该模式的子角色

输出

  Col1 Col2 Col3                                info col4 col5
0    A    B    C     A;AC=a;AD=E;AE=W;AF=u;AG=Q;AH=R    F    G
1    h    k    J       AB=k;AC=5;AD=E;AF=W;AG=y;AH=Q    L    M
2    O    P    Q  AC=k;AD=e;AE=E;AF=W;AG=y;AH=Q;AK=R    S    T
3    U    V    W       AC=a;AD=b;AE=r;AF=y;AG=Q;AH=R    Y    Z
4    U    V    W       AC=a;AD=b;AE=r;AF=y;AG=Q;AH=R    Y    Z

一个非常简单的解决方案,基于列表理解和拆分连接函数

df['info'] = [';'.join(e.split(',')[0] for e in d.split(';')) for d in df['info']]

如果重复的部分是AF=0.500,0.500,那么使用\1,它仍然不能变成AF=0。500@AAlex请参阅使用新模式更新的答案。AF=0.500在第1行。我使用您的代码,但它不会改变。你更新内容了吗?@AAlex抱歉,我不明白为什么没有包括更新的模式。现在是了。那么AF=0.500,0.500,希望变成AF=0.500怎么样?