2017-02-21 1 views
1

Ich bin völlig verwirrt, warum ich einen ValueError auf diesen Code bekomme; jede Hilfe wird geschätzt.Warum erscheint dieser Wert als mehrdeutig?

Ich habe einen Datenrahmen namens global_output mit zwei Spalten: eine Spalte von Wörtern und Spalte mit entsprechenden Werten. Ich möchte eine mittlere Aufteilung der Werte vornehmen und die Wörter in zwei Listen aufteilen - hoch und niedrig - je nachdem, ob sie über oder unter dem Median liegen.

 Word   Ranking 
0  shuttle  0.9075 
1  flying  0.7750 
2  flight  0.7250 
3  trip   0.6775 
4  transport 0.6250 
5  escape  0.5850 
6  trajectory 0.5250 
7  departure 0.5175 
8  arrival  0.5175 

Mein Code, dies zu tun ist wie folgt:

split = global_output['Abstraction'].quantile([0.5]) 

high = [] 
low = [] 


for j in range(len(global_output)): 
    if global_output['Ranking'][j] > split: 
     low_clt.append(global_output['Word'][j]) 
    else: 
     high.append(global_output['Word'][j]) 

Allerdings halte ich diesen Fehler.

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Nun, ich verstehe, was der Fehler bedeutet: es sagt, ich versuche, eine Serie mit mehreren Werten zu bewerten, als ob es ein einzelner Wert war. Trotzdem kann ich einfach nicht sehen,

global_output['Ranking'][j] 

ist in keiner Weise mehrdeutig, wenn j einen ganzzahligen Wert aus der Schleife nimmt. Wenn ich es in die Konsole gebe, liefert es jedes Mal einen Gleitkommawert. Was fehlt mir hier?

Antwort

1

Sie mit arrays arbeiten, so ist besser boolean indexing mit mask und loc für Spalte auswählen verwenden:

#if need column Abstraction, change it 
split = global_output['Ranking'].quantile([0.5]).item() 
print (split) 
0.625 

mask = global_output['Ranking'] <= split 
print (mask) 
0 False 
1 False 
2 False 
3 False 
4  True 
5  True 
6  True 
7  True 
8  True 
Name: Ranking, dtype: bool 

high = global_output.loc[~mask, 'Word'].tolist() 
low = global_output.loc[mask, 'Word'].tolist() 

print (high) 
['shuttle', 'flying', 'flight', 'trip'] 

print (low) 
['transport', 'escape', 'trajectory', 'departure', 'arrival'] 

Ihre Lösung funktioniert auch, müssen nur Series-scalar von item() ein Element konvertieren und es scheint, > muss < sein:

split = global_output['Ranking'].quantile([0.5]) 
print (split) 
0.5 0.625 
Name: Ranking, dtype: float64 

split = global_output['Ranking'].quantile([0.5]).item() 
print (split) 
0.625 

Und Sie erhalten error, weil Sie einen Artikel Series vergleichen.

+0

Ah, ich verstehe! Die Mehrdeutigkeit kam von global_output ['Ranking']. Quantile ([0.5]). Dies löst das Problem sehr gut. Danke auch für die wirklich hilfreichen Vorschläge zum Maskieren! – Lodore66

+0

Genau. Sie haben Recht - müssen Sie beide Skalare vergleichen. – jezrael

Verwandte Themen