【问题标题】:Create a new column if ends with certain string如果以某个字符串结尾,则创建一个新列
【发布时间】:2018-12-02 09:41:52
【问题描述】:

我有一个数据框和一个列表。我想检查列中的字符串是否以列表中的任何内容结尾。我想创建一个新列,显示列是否以列表中的任何内容结尾,然后值为“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().

有什么建议吗?谢谢!

【问题讨论】:

    标签: python string pandas series ends-with


    【解决方案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】:

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

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

      【讨论】:

      • 嗨,Patti,我运行了您的代码并出现错误:AttributeError: 'Series' object has no attribute 'endswith'
      • 我错过了您使用 Pandas 的事实。查看 jpp 的答案。
      【解决方案3】:

      您可以将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
      

      【讨论】:

        【解决方案4】:

        使用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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-09
          • 2014-06-12
          • 1970-01-01
          • 2022-11-23
          • 2019-09-18
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          相关资源
          最近更新 更多