条件If语句:如果行中的值包含字符串...设置另一列等于字符串

问题描述 投票:0回答:7

编辑完成:

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

因此 Activity_2 显示了所需的结果。 本质上我想指出正在发生什么类型的活动。

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

enter image description here

    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
python string if-statement conditional-statements contains
7个回答
39
投票

我假设您使用的是

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

14
投票

这也有效:

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'

12
投票

如果 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"))))

3
投票

检查字符串的语法无效。

尝试使用

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

2
投票
  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)

1
投票

另一个解决方案可以在@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 有条件创建系列/数据框列


0
投票

用一个相关问题重新提出这个问题,我希望得到一些帮助: 如果我的 PDF 模板有一个名为“Response_Type”的下拉表单字段,用于选择模板将用于的回复信函类型,其中用户从组合框项目中进行选择,每个项目都包含单词“成员”或“提供者”,如何运行“Salution”表单字段的脚本来检查是否根据所选的“Response_Type”发布/显示“亲爱的会员:”或“亲爱的提供商:”? 提前非常感谢!

似乎应该存在 if((this.getField("Response_Type").value == "Provider")) 的某种变体,其中 == 被替换为 CONTAINS,当然不存在这样的语法。 有什么解决办法吗?

if((this.getField("Response_Type").value CONTAINS "Provider")) event.value = "尊敬的提供者:"; 别的 if((this.getField("Response_Type").value CONTAINS "会员申诉 -")) event.value = "尊敬的会员:"; 别的 事件.value = "

© www.soinside.com 2019 - 2024. All rights reserved.