if 函数未按预期返回结果

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

如果在主题列中找到特定字符串,我尝试在相应列中添加“是”:即,如果在“描述”列的条目中找到“视觉”,则应在“描述”列中返回“是” “视觉任务”栏。

它按预期工作,如第一个屏幕截图所示。

test output

但是当我尝试使用 if 语句填充“视觉任务”列时,它无法按预期工作。

if statement output

pandas if-statement boolean
1个回答
0
投票

最小可重现示例

(注意:始终代码发布到Q正文中反引号(

```
)之间的块中,不要使用图片)。

import pandas as pd
import numpy as np

data = {'Description': ['VisUAL MINIMAL',
                        'REPRODUCIBLE VISUAL',
                        'visul EXAMPLE']}

df_datasetcritic_2 = pd.DataFrame(data)

# create boolean series
boolean = df_datasetcritic_2['Description'].str.contains('visual', regex=False, case=False)

问题:如何添加列“Visual Task”:'Yes' if boolean == True, else '1'?


选项1

df_datasetcritic_2['Visual Task'] = np.where(boolean, 'Yes', '1')

df_datasetcritic_2

           Description Visual Task
0       VisUAL MINIMAL         Yes
1  REPRODUCIBLE VISUAL         Yes
2        visul EXAMPLE           1

选项2

df_datasetcritic_2['Visual Task'] = boolean.map({True: 'Yes', False: '1'})

# same result

OP的尝试存在问题

此处使用

if...else
语句没有意义:

  1. 您正在使用
    is
    ,而您想要使用
    ==
    的地方。如果两个变量指向内存中的同一个对象,则
    is
    返回
    True
    ==
    检查是否相等。比照。 这里
boolean is True

# answer: `False`; so, your code executes:
# df_datasetcritic_2['Visual Task'] = '1'
  1. 使用预期版本(
    ==
    )会导致一个非常常见的错误:
if boolean == True:
    print('do stuff')

ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

有关问题,请参阅此处此处。您可以

if...else
中使用
Series.apply
。例如:

df_datasetcritic_2['Visual Task'] = boolean.apply(lambda x: 'Yes' if x == True else '1')

# same result

避免这样做。它会比上面的矢量化选项慢得多。进一步查看此处

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