2016-08-08 6 views
-1
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"] 

es scheint so zu sein,Verwenden a.empty, a.bool(), a.item(), a.any() oder a.All()

Fehler, die ich erhalte: ValueError: Der Wahrheitswert einer Serie ist mehrdeutig. Verwenden Sie a.empty, a.bool(), a.item(), a.any() oder a.all(). wie ich es

aussortieren kann
+0

Welche Zeile des Codes verursacht diesen Fehler? Das Problem hat damit zu tun, etwas wie ein Wörterbuch oder eine Liste mit etwas zu vergleichen, das ein String, char, int usw. ist, da diese Werte nicht verglichen werden können. – BrandonM

+1

Sie können nicht 'a user2357112

Antwort

2

Wie user2357112 ersetzen erwähnt, können Sie nicht Vergleich hier angekettet. Für den elementweisen Vergleich müssen Sie & verwenden. Dies erfordert auch die Verwendung von Klammern, so dass & nicht Vorrang haben.

Es wäre in etwa so gehen:

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

Um das zu vermeiden, können Sie Reihe für untere und obere Grenze bauen:

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) 

Jetzt können Sie es drehen wie folgt:

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 

Und für die Zuordnung können Sie np.where verwenden:

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

nur um Sie wissen zu lassen, dass die erste Lösung nicht funktionierte, aber die zweite Lösung löst mein Problem. Vielen Dank und viel Glück, anderen wie mir zu helfen. –

+0

@ShamsulMasum Wenn Sie '," excellent "," critical ")' am Ende hinzufügen, wie Sie es in der Frage getan haben, wird es nicht funktionieren. Es sollte nur Bedingungen enthalten. Dann können Sie np.where verwenden. – ayhan

+0

was ist, wenn ich mehr Klassenoption hinzufügen muss, wie hier habe ich nur zwei (ausgezeichnet und kritisch). –

0

Lösung ist einfach:

in den Kommentaren
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") 

von

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") 
Verwandte Themen