【问题标题】:Use a.empty, a.bool(), a.item(), a.any() or a.all()使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
【发布时间】:2016-12-14 12:19:11
【问题描述】:
import random
import pandas as pd

heart_rate = [random.randrange(45,125) for _ in range(500)]
blood_pressure_systolic = [random.randrange(140,230) for _ in range(500)]
blood_pressure_dyastolic = [random.randrange(90,140) for _ in range(500)]
temperature = [random.randrange(34,42) for _ in range(500)]
respiratory_rate = [random.randrange(8,35) for _ in range(500)]
pulse_oximetry = [random.randrange(95,100) for _ in range(500)]


vitalsign = {'heart rate' : heart_rate,
             'systolic blood pressure' : blood_pressure_systolic,
             'dyastolic blood pressure' : blood_pressure_dyastolic,
             'temperature' : temperature,
             'respiratory rate' : respiratory_rate,
             'pulse oximetry' : pulse_oximetry}


df = pd.DataFrame(vitalsign)


df.to_csv('vitalsign.csv')


mask = (50  < df['heart rate'] < 101 &
        140 < df['systolic blood pressure'] < 160 &
        90  < df['dyastolic blood pressure'] < 100 &
        35  < df['temperature'] < 39 &
        11  < df['respiratory rate'] < 19 &
        95  < df['pulse oximetry'] < 100
        , "excellent", "critical")

df.loc[mask, "class"]

好像是这样,

我收到的错误:

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

。怎么解决

【问题讨论】:

  • 哪一行代码导致了这个错误?该问题与将字典或列表之类的内容与字符串、char、int 等内容进行比较有关,因为无法比较这些值。
  • 你不能使用 a &lt; b &lt; c 与 pandas 进行链式比较,出于同样的原因,你必须使用 &amp; 而不是 and
  • @cs95 指示的重复项只是部分重复项。因为副本确实使用链式比较。上述代码有两个问题,重复的只回答其中一个。

标签: python pandas


【解决方案1】:

正如 cmets 中提到的 user2357112,您不能在此处使用链式比较。对于元素比较,您需要使用&amp;。这也需要使用括号,这样&amp; 就不会优先。

它会是这样的:

mask = ((50  < df['heart rate']) & (101 > df['heart rate']) & (140 < df['systolic...

为了避免这种情况,您可以构建下限和上限的系列:

low_limit = pd.Series([90, 50, 95, 11, 140, 35], index=df.columns)
high_limit = pd.Series([160, 101, 100, 19, 160, 39], index=df.columns)

现在你可以按如下方式对其进行切片:

mask = ((df < high_limit) & (df > low_limit)).all(axis=1)
df[mask]
Out: 
     dyastolic blood pressure  heart rate  pulse oximetry  respiratory rate  \
17                        136          62              97                15   
69                        110          85              96                18   
72                        105          85              97                16   
161                       126          57              99                16   
286                       127          84              99                12   
435                        92          67              96                13   
499                       110          66              97                15   

     systolic blood pressure  temperature  
17                       141           37  
69                       155           38  
72                       154           36  
161                      153           36  
286                      156           37  
435                      155           36  
499                      149           36  

对于分配,您可以使用 np.where:

df['class'] = np.where(mask, 'excellent', 'critical')

【讨论】:

  • 只是为了让您知道第一个解决方案不起作用,但第二个解决方案确实解决了我的问题。非常感谢,祝你好运帮助像我这样的人。
  • @ShamsulMasum 如果您像在问题中那样将, "excellent", "critical") 添加到末尾,它将不起作用。它应该只包含条件。然后你可以使用 np.where。
  • 如果我需要添加更多类选项怎么办,比如这里我只有两个(优秀和关键)。
  • 你能举个例子吗?
【解决方案2】:

解决方法很简单:

替换

 mask = (50  < df['heart rate'] < 101 &
            140 < df['systolic blood pressure'] < 160 &
            90  < df['dyastolic blood pressure'] < 100 &
            35  < df['temperature'] < 39 &
            11  < df['respiratory rate'] < 19 &
            95  < df['pulse oximetry'] < 100
            , "excellent", "critical")

mask = ((50  < df['heart rate'] < 101) &
        (140 < df['systolic blood pressure'] < 160) &
        (90  < df['dyastolic blood pressure'] < 100) &
        (35  < df['temperature'] < 39) &
        (11  < df['respiratory rate'] < 19) &
        (95  < df['pulse oximetry'] < 100)
        , "excellent", "critical")

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2021-08-31
    • 2016-12-01
    • 1970-01-01
    • 2019-01-24
    • 2021-08-06
    • 2020-05-27
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多