我需要将数据框写入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个startswith" - "," ="," ","一起循环并循环它们,直到他们遇到第一个字母或角色(有时可能是日语或中文。)
期望最终my_df:
A B C
0 I love Mercedes-Benz 4 Love this
1 Looks so good! 2 5-year-old
您可以使用str.lstrip
来删除这些领先字符:
my_df.A.str.lstrip('+-=')
0 I love Mercedes-Benz
1 Looks so good!
Name: A, dtype: object
实现它的一种方法可以是
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("+=- ")
请小心,因为条将从字符串的两侧删除字符。lstrip
而不是只能在左侧完成工作。
功能startswith
接受前缀的元组:
while test.startswith(('+','-','=',' ')):
test=test[1:]
,但是你不能将其放在lambda中。但是,您不需要lambda:只需写下功能并将其名称传递给map
。
作为正则恋人和可能的解决方案,我也将添加此解决方案:
import re
my_df["A"]=my_df["A"].map(lambda x: re.sub('^[*-=s]*', '', x))
正则读数:
^
从开始
[]
此组中的项目
s
任何空间
*
零或更多
因此,从字符串的开头,这将匹配(并无需替换)所有字符的所有字符