Python:将lambda与startswith一起使用

时间:2019-03-12 09:05:04

标签: python pandas

我需要将数据帧写入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

4 个答案:

答案 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任何空格
*为零或更多
因此它将匹配(并且不替换任何内容)字符串开头的所有方括号中的字符