使用a.empty,a.bool(),a.item(),a.any()或a.all()

Sha*_*sum 5 python pandas

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"]
Run Code Online (Sandbox Code Playgroud)

好像是这样,

我收到的错误:

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

.我怎么能解决它

ayh*_*han 6

正如评论中提到的user2357112,您不能在此处使用链式比较.对于元素比较,您需要使用&.这也需要使用括号,这样才&不会优先.

它会是这样的:

mask = ((50  < df['heart rate']) & (101 > df['heart rate']) & (140 < df['systolic...
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

现在您可以按如下方式切片:

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  
Run Code Online (Sandbox Code Playgroud)

对于作业,您可以使用np.where:

df['class'] = np.where(mask, 'excellent', 'critical')
Run Code Online (Sandbox Code Playgroud)