我的调查数据在pandas数据框中显示答案如下:
A B C D E
a. cattle c. bird b. cat a. cattle 1.20-60
c. bird b. cat a. cattle b. cat 3.61-103
b. cat a. cattle c. bird c. bird 2.10-19
我正在尝试删除答案参考字符/数字(' a。',b。',' c。',' 1。 ,' 2。',3。')以及在实际答案之前发生的白色空间,留下看起来像这样的东西:
A B C D E
cattle bird cat cattle 20-60
bird cat cattle cat 61-103
cat cattle bird bird 10-19
以下代码使用的是一个字典,用于说明哪个答案引用需要替换为'':
df[repval_cols].replace({
'a. ':'',
'b. ':'',
'c. ':'',
'1.':'',
'2.':'',
'3.':'',
}, regex=True)
[repval_cols]是我希望发生这种情况的数据框中的列列表。
但是我遇到的问题是我从上面使用的代码会删除列中字符串中的每个字符实例,因此它会留下像这样的无意义数据:
A B C D E
cttle ird ct cttle 0-60
ird ct cttle ct 6-0
ct cttle ird ird 0-9
有人可以解释为什么它会替换与我字典中的字符不匹配的字符吗?我明确表示要更换' a。 '与''不只是任何' a'在字符串中。
非常感谢任何建议/建议
答案 0 :(得分:1)
您可以根据第一个时段将字符串拆分为两个。然后从分割对中取出第二个项目并去掉空格。
>>> (df.apply(lambda s: s.str.split('.', n=1))
.apply(lambda s: [pair[1].strip() for pair in s])
)
A B C D E
0 cattle bird cat cattle 20-60
1 bird cat cattle cat 90-300
2 cat cattle bird bird 10-19
对于正则表达式语句,您需要转义句点(点或.
),这是用于匹配任何字符的正则表达式中的元字符。要匹配文字点,您需要将其转义(\.
)。
>>> df.replace({
'a\. ': '',
'b\. ': '',
'c\. ': '',
'1\.': '',
'2\.': '',
'3\.': ''}, regex=True)
A B C D E
0 cattle bird cat cattle 20-60
1 bird cat cattle cat 90-300
2 cat cattle bird bird 10-19
答案 1 :(得分:0)
你不需要正则表达式进行这种转换。
将字符串拆分为.
,取第二个元素和strip
def parse(mystr):
return mystr.split('.')[1].strip()
df[repval_cols].applymap(parse)
以下是applymap method
的文档。它将提供的函数应用于数据框中的每个元素,类似于apply方法。
答案 2 :(得分:0)
我明确地说要取代'a。 'with''不仅仅是字符串中的任何'a'。
您的问题是.
点,这是任何字符的正则表达式中的wildcard
。
使用\.
将其转义并使其成为 literal dot 可能会解决您的问题。
因此,您的代码变为。
df[repval_cols].replace({
'a\. ':'',
'b\. ':'',
'c\. ':'',
'1\.':'',
'2\.':'',
'3\.':'',
}, regex=True)