如果以某些字符串结尾,则创建一个新列

时间:2018-06-22 21:42:42

标签: python string pandas series ends-with

我有一个数据框和一个列表。我想检查列中的字符串是否以列表中的任何内容结尾。我想创建一个新列,显示列是否以列表中的任何内容结尾,然后值为“ Y”,其他为“ N”。我的数据框数据如下:

import pandas as pd
city = ['New York', 'Los Angeles','Buffalo','Miami','San Deigo', 'San 
Francisco']
population = ['8.5','3.9','0.25','0.45','1.4','0.87']
df = pd.DataFrame({'city':city,'population':population})

ending = ['les','sco', 'igo']

预期结果应如下所示:

city          population    flag
New York       8.5          N
Los Angeles    3.9          Y
Buffalo        0.25         N
Miami          0.45         N
San Deigo      1.4          Y
San Francisco  0.87         Y

我尝试使用if语句:

if df['city'].str.endswith(tuple(ending)):
   val = 'Y'
elif df['city'].str.endswith(tuple(ending)):
    val= 'Y'
else:
   val = 'N'

我收到错误消息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

有什么建议吗?谢谢!

4 个答案:

答案 0 :(得分:2)

使用str.endswith,此剂量结尾不需要相同长度的字符串

df.city.str.endswith(tuple(ending)).map({True:'Y',False:'N'})
0    N
1    Y
2    N
3    N
4    Y
5    Y
Name: city, dtype: object

答案 1 :(得分:1)

假设结尾始终是三个字符串,则可以使用:

df['flag']=df['city'].map(lambda x: x[-3:] in ending) 

产生

            city population   flag
0       New York        8.5  False
1    Los Angeles        3.9   True
2        Buffalo       0.25  False
3          Miami       0.45  False
4      San Deigo        1.4   True
5  San Francisco       0.87   True

如果您确实需要将二进制结果设置为Y / N(而不是True / False),则可以执行其他映射:

def bin(arg):
    if arg==True:
        return 'Y'
    return 'F'

df.flag=df.flag.map(lambda x: bin(x))

结果

            city population flag
0       New York        8.5    F
1    Los Angeles        3.9    Y
2        Buffalo       0.25    F
3          Miami       0.45    F
4      San Deigo        1.4    Y
5  San Francisco       0.87    Y

答案 2 :(得分:1)

您可以使用pd.Series.isin,然后使用pd.Series.map进行字典映射。此解决方案专门测试最后3个字符。否则,请使用@Wen's solution

ending = ['les', 'sco', 'igo']
mapper = {True: 'Y', False: 'N'}

df['flag'] = df['city'].str[-3:].isin(ending).map(mapper)

print(df)

            city population flag
0       New York        8.5    N
1    Los Angeles        3.9    Y
2        Buffalo       0.25    N
3          Miami       0.45    N
4      San Deigo        1.4    Y
5  San Francisco       0.87    Y

答案 3 :(得分:0)

any built-in function可以提供帮助。

val = 'Y' if any(df['city'].endswith(e) for e in ending) else 'N'