Python:将Lambda与Startswith一起使用



我需要将数据框写入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任何空间
*零或更多
因此,从字符串的开头,这将匹配(并无需替换)所有字符的所有字符

最新更新