【问题标题】:Conditional If Statement: If value in row contains string ... set another column equal to string条件 If 语句:如果行中的值包含字符串...设置另一列等于字符串
【发布时间】:2017-10-09 21:30:51
【问题描述】:

编辑:

我有一个用字符串填充的“Activity”列,我想使用 if 语句导出“Activity_2”列中的值。

所以 Activity_2 显示了预期的结果。本质上,我想指出正在发生的活动类型。

我尝试使用下面的代码执行此操作,但它无法运行(请参阅下面的屏幕截图以了解错误)。任何帮助是极大的赞赏!

    for i in df2['Activity']:
        if i contains 'email':
            df2['Activity_2'] = 'email'
        elif i contains 'conference'
            df2['Activity_2'] = 'conference'
        elif i contains 'call'
            df2['Activity_2'] = 'call'
        else:
            df2['Activity_2'] = 'task'


Error: if i contains 'email':
                ^
SyntaxError: invalid syntax

【问题讨论】:

  • 你试过了吗if i == 'email': df2['Activity_2'] = 'email'
  • “不会运行”很没用
  • 感谢您的快速响应。当我尝试上面的代码时,我的数据框中没有“Activity_2”列
  • @donk:我已经在我的消息中发布了我的错误
  • 您在带有“elif”语句的行中有一堆丢失的冒号

标签: python string if-statement conditional contains


【解决方案1】:

假设你使用的是pandas,那么你可以使用numpy.where,它是if/else的矢量化版本,条件由str.contains构造:

df['Activity_2'] = pd.np.where(df.Activity.str.contains("email"), "email",
                   pd.np.where(df.Activity.str.contains("conference"), "conference",
                   pd.np.where(df.Activity.str.contains("call"), "call", "task")))

df

#   Activity            Activity_2
#0  email personA       email
#1  attend conference   conference
#2  send email          email
#3  call Sam            call
#4  random text         task
#5  random text         task
#6  lwantto call        call

【讨论】:

【解决方案2】:

您检查字符串的语法无效。

尝试使用

 for i in df2['Activity']:
        if 'email' in i :
            df2['Activity_2'] = 'email'

【讨论】:

    【解决方案3】:

    这也有效:

    df.loc[df['Activity'].str.contains('email'), 'Activity_2'] = 'email'
    df.loc[df['Activity'].str.contains('conference'), 'Activity_2'] = 'conference'
    df.loc[df['Activity'].str.contains('call'), 'Activity_2'] = 'call'
    

    【讨论】:

    • 我意识到这里已经有几年了 - 但我有数千行这样的行 - 你将如何有效地实现它们?
    【解决方案4】:

    如果您的 df 包含 NaN 值,则当前解决方案的行为错误。在这种情况下,我建议使用以下对我有用的代码

    temp=df.Activity.fillna("0")
    df['Activity_2'] = pd.np.where(temp.str.contains("0"),"None",
                       pd.np.where(temp.str.contains("email"), "email",
                       pd.np.where(temp.str.contains("conference"), "conference",
                       pd.np.where(temp.str.contains("call"), "call", "task"))))
    

    【讨论】:

    • 最后,一个有效的解决方案可以解决默认值/NAs
    【解决方案5】:

    另一个解决方案可以在@unutbu 的帖子中找到。这对于创建条件列也很有效。我更改了该帖子df['Set'] == Z 中的示例,以将您的问题与df['Activity'].str.contains('yourtext') 匹配。请参阅下面的示例:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'Activity': ['email person A', 'attend conference', 'call foo']})
    
    conditions = [
        df['Activity'].str.contains('email'),
        df['Activity'].str.contains('conference'),
        df['Activity'].str.contains('call')]
    
    values = ['email', 'conference', 'call']
    
    df['Activity_2'] = np.select(conditions, values, default='task')
    
    print(df)
    

    你可以在这里找到原帖:Pandas conditional creation of a series/dataframe column

    【讨论】:

    • 试过了,但所有值都是默认值
    • @DaveLiu 该示例在我的 Jupyter 笔记本实例中完美运行。你能进一步解释你的问题吗?复制了这个 1-on-1 还是你尝试了什么?
    • 我不记得这个问题,可能是 pandas/numpy 版本差异
    【解决方案6】:
    1. 您的代码有错误 - “elif”行上没有冒号。
    2. 您没有提到您使用的是 Pandas,但这是我的假设。
    3. 我的答案处理默认值,使用适当的 Python 约定,是最有效、最新且易于适应其他活动的答案。
    
    DEFAULT_ACTIVITY = 'task'
    
    
    def assign_activity(todo_item):
        """Assign activity to raw text TODOs
        """
        activities = ['email', 'conference', 'call']
    
        for activity in activities:
            if activity in todo_item:
                return activity
            else:
                # Default value
                return DEFAULT_ACTIVITY
    
    df = pd.DataFrame({'Activity': ['email person A', 'attend conference', 'call Charly'],
                       'Colleague': ['Knor', 'Koen', 'Hedge']})
    
    # You should really come up with a better name than 'Activity_2', like 'Labels' or something.
    df["Activity_2] = df["Activity"].apply(assign_activity)
    

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2015-08-19
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多