2017-01-25 5 views
1

New so leider Pandas wenn dies ein alter Hut ist. Was ich versuche zu erreichen, ähnlich dem, was in grouping rows in list in pandas groupby enthalten ist, aber ich habe mehr als zwei Spalten und kann nicht herausfinden, wie alle meine Spalten mit dem gruppierten Wert angezeigt, miteinander auszukommen. Hier ist, was ich versuche zu tun.Pandas GROUPBY + Liste

data = [{'ip': '192.168.1.1', 'make': 'Dell', 'model': 'UltraServ9000'}, 
{'ip': '192.168.1.3', 'make': 'Dell', 'model': 'MiniServ'}, 
{'ip': '192.168.1.5', 'make': 'Dell', 'model': 'UltraServ9000'}, 
{'ip': '192.168.1.6', 'make': 'HP', 'model': 'Thinger3000'}, 
{'ip': '192.168.1.8', 'make': 'HP', 'model': 'Thinger3000'}] 

In [2]: df = pd.DataFrame(data) 
In [3]: df 
Out[4]: 
      ip make   model 
0 192.168.1.1 Dell UltraServ9000 
1 192.168.1.3 Dell  MiniServ 
2 192.168.1.5 Dell UltraServ9000 
3 192.168.1.6 HP Thinger3000 
4 192.168.1.8 HP Thinger3000  

<magic> 

Out[?]:  
      ip    make   model 
0 192.168.1.1, 192.168.1.5 Dell UltraServ9000 
1 192.168.1.3    Dell  MiniServ 
3 192.168.1.6, 192.168.1.8 HP  Thinger3000 

Vielen Dank im Voraus :)

+0

Sorry, aber das ist wirklich ein Narr dies: http://stackoverflow.com/questions/22219004/grouping-rows-in-list-in-pandas-groupby, im Grunde alles, was Sie wollen, ist 'In [107]: df.groupby ([ 'a', 'c']) [ 'b'] gelten (Liste) Out [107]. ac A foo [1, 2] B foo [5, 5, 4] C foo [6] Name: b, dtype: object' – EdChum

+0

Willkommen in Stapelüberlauf. In Zukunft sollten Sie die Rohdaten erstellen, damit die Benutzer mit Ihren Daten experimentieren können - auf diese Weise erhalten Sie bessere/schnellere Antworten. Außerdem sind "a" und "A" nicht großartig, um sowohl Spaltennamen als auch Datenwerte zu verwenden, wenn Sie Beispiele erstellen. – flyingmeatball

+0

Hallo - es ist fast ein Duplikat, aber ich laufe in Fragen wie ich 20-einig-ungeradee Spalten, also was ich versuche ein groupby zu tun auf „A“, die Liste in „B“, und dann Zeigen Sie einfach die Werte aller anderen Spalten an, die für jede Zeile identisch sind. – liam

Antwort

2

groupby nimmt einen Parameter, by, durch die man eine list von Variablen angeben können Sie Ihre groupby über betreiben wollen. So ist die Antwort dieser Frage wird wie folgt geändert:

df.groupby(by = ["a", "c"])["b"].apply(list).reset_index() 

EDIT: Betrachten Sie Ihren Kommentar: da alle anderen Spalten als a die gleichen Werte haben, können Sie sie einfach in der by Parameterliste können, weil sie nicht beeinflussen das Ergebnis. Um Zeit zu sparen und verhindern, dass Sie tatsächlich alle Namen geben Sie so etwas tun könnte:

df.groupby(by = list(set(df.columns) - set(["b"])))["b"].apply(list).reset_index() 
Alternativ

, könnten Sie die agg Funktion ausnutzen, indem er ein Wörterbuch vorbei, die für alle Spalten nehmen die max und für b die Liste wird zurückkehren:

aggregate_functions = {x: max for x in df.columns if x != "a" and x != "b"} 
aggregate_functions["b"] = lambda x: list(x) 
df.groupby(by = "a").agg(aggregate_functions) 

, die Sie bevorzugen liegt an Ihnen, wahrscheinlich das letztere ist besser lesbar.

+0

Danke! Das ist nah an dem, was ich suche und sehr ähnlich zu dem fast-Duplikat, das ich oben verlinkt habe. Ich hätte spezifizieren sollen, dass ich nicht nur drei Spalten habe (A, B, C), ich habe 20. Ich versuche, durch eins zu gruppieren, listet in den anderen auf, dann zeige einfach den Rest der Spalten an, wie es ist Sie sind für jede Zeile identisch. – liam

+0

Sorry, ich habe die Frage falsch verstanden. Siehe meine Bearbeitung. – Mikk

+0

Völlig meine Schuld. Ich versuche immer noch meinen Kopf um Pandas zu legen und verliere diesen Kampf eindeutig. Ich habe mein Beispiel oben aktualisiert, um hoffentlich nützlicher zu sein. Entschuldigung für die Verwirrung! – liam