我需要将数据帧写入csv,并且其中一些系列以“ +-=”开头,因此我需要先将其删除。
我尝试使用字符串进行测试:
test="+++++-= I love Mercedes-Benz"
while True:
if test.startswith('+') or test.startswith('-') or test.startswith('=') or test.startswith(' '):
test=test[1:]
continue
else:
print(test)
break
输出看起来很完美:
I love Mercedes-Benz.
现在,当我想在数据框中使用lambda时执行相同的操作时:
import pandas as pd
col_names = ['A', 'B', 'C']
my_df = pd.DataFrame(columns = col_names)
my_df.loc[len(my_df)] = ["++++-= I love Mercedes-Benz", 4, "Love this"]
my_df.loc[len(my_df)] = ["=Looks so good!", 2, "5-year-old"]
my_df
my_df["A"]=my_df["A"].map(lambda x: x[1:] if x.startswith('=') else x)
print(my_df["A"])
我不确定如何将以“-”,“ =“,“ +”,“,”开头的4个开头放在一起,直到它们遇到第一个字母或字符(有时可能是日语或中文)。 / p>
预期的最终my_df:
A B C
0 I love Mercedes-Benz 4 Love this
1 Looks so good! 2 5-year-old
答案 0 :(得分:3)
您可以使用str.lstrip
来删除这些前导字符:
my_df.A.str.lstrip('+-=')
0 I love Mercedes-Benz
1 Looks so good!
Name: A, dtype: object
答案 1 :(得分:0)
函数startswith
接受一个前缀元组:
while test.startswith(('+','-','=',' ')):
test=test[1:]
但是您不能将其放在lambda中。但是然后,您不需要lambda:只需编写函数并将其名称传递给map
。
答案 2 :(得分:0)
一种实现它的方法可能是
old = ""
while old != my_df["A"]:
old = my_df["A"]
my_df["A"]=my_df["A"].map(lambda x: x[1:] if any(x.startswith(char) for char in "-=+ ") else x)
但是我想警告您关于字符串的strip()方法:
>>> test="+++++-= I love Mercedes-Benz"
>>> test.strip("+-=")
' I love Mercedes-Benz'
因此您的数据提取可以变得更简单:
my_df["A"].str=my_df["A"].str.strip("+=- ")
请小心,因为strip将删除字符串两侧的字符。 lstrip
只能在左侧完成这项工作。
答案 3 :(得分:0)
作为lover of regex并且可能是复杂的解决方案,我还将添加此解决方案:
import re
my_df["A"]=my_df["A"].map(lambda x: re.sub('^[*-=\s]*', '', x))
正则表达式为:
从一开始^
此群组中的[]
个项目
\s
任何空格
*
为零或更多
因此它将匹配(并且不替换任何内容)字符串开头的所有方括号中的字符