Python 是否删除熊猫中字符串列中的重复字符?
例如,在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 “信息”栏中重复的单词很难纠正。我需要删除逗号和后面的字符 这是数据帧: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=
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怎么样?