2016-11-28 2 views
1

Ich versuche, die Daten von einer einzelnen Spalte in einem Datenframe in eine Liste zu verschieben. SoVerschieben von Werten eines Datenrahmens in eine Liste basierend auf einer Bedingung

Account Name Renewal % Change 
Client 1  0% 
Client 2  0% 
Client 3  2% 
Client 4  0% 
Client 5  1% 
Client 6  1% 

Wenn ein Client 0% hat es in die Liste Cost0 hinzugefügt bekommen und es hat 1% es cost1 hinzukommen sollte.

Ich versuchte mit einer pd.series.tolist(), aber es gab mir einen Fehler.

if brl['Renewal % Change'] == '0%': 
    a = pd.Series(brl['Account Name']) 
    a.tolist() 

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

Bitte geben

+0

Ich kann es jetzt nicht überprüfen, aber ist es nicht eine 'if' Aussage, dass Sie den Fehler bekommen r aus? so etwas versuchen. list1 = brl.loc [brl [ 'Erneuerung% Veränderung'] == '0%', 'Kontoname'] ToList() list2 = brl.loc [brl [ 'Renewal% Change'] == '1%', 'Kontoname']. Tolist() – Matek

Antwort

1

Versuchen Sie, diese

Cost0 = brl[blr['Renewal % Change']=='0%']['Account Name'].tolist() 
Cost1 = brl[blr['Renewal % Change']=='1%']['Account Name'].tolist() 
+0

Danke, das ist eine einfache Lösung und funktioniert genau so, wie ich es wollte –

1

Sie etwas geändert boolean indexing mit der Auswahl Spalte von loc verwenden können:

mask = brl['Renewal % Change'] == '0%' 
print (mask) 
0  True 
1  True 
2 False 
3  True 
4 False 
5 False 
Name: Renewal % Change, dtype: bool 

print (brl.loc[mask, 'Account Name'].tolist()) 
['Client 1', 'Client 2', 'Client 4'] 

Alle zusammen:

Cost0 = brl.loc[brl['Renewal % Change'] == '0%', 'Account Name'].tolist() 
print (Cost0) 
['Client 1', 'Client 2', 'Client 4'] 

Cost1 = brl.loc[brl['Renewal % Change'] == '1%', 'Account Name'].tolist() 
print (Cost1) 
['Client 5', 'Client 6'] 

Sie erhalten Fehler, weil Vergleich Rückkehr boolean Series - Array, nicht skalaren Wert, siehe docs:

print (brl['Renewal % Change'] == '0%') 
0  True 
1  True 
2 False 
3  True 
4 False 
5 False 
Name: Renewal % Change, dtype: bool 

Vergleich Lösungen - mit loc schneller ist:

In [137]: %timeit brl.loc[brl['Renewal % Change'] == '0%', 'Account Name'].tolist() 
1000 loops, best of 3: 536 µs per loop 

In [138]: %timeit brl[brl['Renewal % Change']=='0%']['Account Name'].tolist() 
1000 loops, best of 3: 657 µs per loop 
+0

Danke die 2. Lösung hat gut funktioniert und auch um den Grund für den Fehler zu geben Also das bedeutet, wenn Bedingung auf Pandas Datenrahmen wird nicht gut funktionieren –

+0

genau, wenn in Pandas selten verwendet wird, weil 'Series',' DataFrames' und 'Panels' Arrays verwenden. – jezrael

+0

Ja, nur eine Lösung kann akzeptiert werden. – jezrael

Verwandte Themen