2016-08-09 174 views
-1

Ich habe eine Berechnung, die ich aggregieren muss, aber es wird nicht mit GROUPBY in PANDAs arbeiten. Also muss ich die Gruppen manuell durchlaufen. Die Gruppen werden durch 2 Felder von "Objekt" -Typ-Werten definiert, die im Wesentlichen die Kategorien sind.Python-Liste verwenden, um bedingte Pandas Aussage zu setzen

Ich denke, eine elegante Lösung kann sein, 2 Listen aus den eindeutigen Werten in den 2 unabhängigen Spalten mit kategorischen Werten zu erstellen. Dann erstellen Sie eine 'for' -Schleife, und verwenden Sie Zeichenfolge Werte oder etwas, durchlaufen Sie meine PANDAs bedingten Anweisung, um einen DataFrame zu erstellen; was dann schließlich mein aggregiertes calc. Dies geschieht immer wieder, wobei nur der Datenrahmen mit der Aggregatberechnung im Speicher gehalten wird, wobei ein Zählerwert wie '1' an das Ende von 'df_' angehängt wird. Um nicht jedes Mal durch die Schleife zu überschreiben. Hier ist mein Pseudo-Code.

cats1=['blue','yellow','pink'] 
cats2=['dog','horse','cow','sheep'] 
lengths=list(itertools.product(cats1,cats2)) 

for x,y,z in zip(cats1,cats2,lengths): 
    df = main_df[ (main_df['col2']==x) & (main_df['col3']==y) ] 
    df['aggcalc'] = df['col1'].agg.mean() 
    locals()['df_{0}'.format(z)] = df 

Die letzte Zeile wird hoffentlich den persistenten Datenrahmen basierend auf der Anzahl der Kombinationen von 'cats1' und 'cats2' erstellen. dh, "df_1", "df_2", usw. ... Dann wird das "df" in den ersten 2 Zeilen jedes Mal in der "for" -Schleife überschrieben. Ist das richtig Denken?

EDIT .............. Hier ist eine einfachere Möglichkeit, es zu betrachten. Ich möchte alle möglichen Kombinationen aus 2 unabhängigen Listen mit unterschiedlicher Länge durchlaufen. Zusätzlich möchte ich in jeder Schleife einen 'Zähler', z 'haben. Dies ist der aktuelle Weg, dies und die anschließende Ausgabe zu schreiben:

for x,y in list(itertools.product(cats1,cats2)): 
    print x,y  


    blue dog 
    blue horse 
    blue cow 
    blue sheep 
    yellow dog 
    yellow horse 
    yellow cow 
    yellow sheep 
    pink dog 
    pink horse 
    pink cow 
    pink sheep 

Wie kann ich mit diesem Ausgang ein ‚z‘ Variable hinzuzufügen, die die Ausgabe aussehen wie

blue dog 0 
    blue horse 1 
    blue cow 2 
    blue sheep 3 
    yellow dog 4 

... etc machen

+0

warum versuchst du es nicht und siehst? – Julien

+2

Ich bin sicher, wenn Sie einen Beispieldatensatz veröffentlichen und Ihre gewünschte Ausgabe zeigen, können wir einen besseren Weg vorschlagen. – ayhan

Antwort

0

Die einfache Antwort auf Ihre Bearbeitung ist nur enumerate zu verwenden:

for z, (x, y) in enumerate(itertools.product(cats1, cats2)): 
    print x, y, z 

blue dog 0 
blue horse 1 
blue cow 2 
blue sheep 3 
yellow dog 4 
yellow horse 5 
yellow cow 6 
yellow sheep 7 
pink dog 8 
pink horse 9 
pink cow 10 
pink sheep 11 

ich stark vermuten t Aber du verpasst eine einfachere Lösung mit groupby. Daher würde ich empfehlen, eine neue Frage mit Dummy-Daten und Details darüber, welche Aggregation du durchführen willst, zu veröffentlichen.

+0

Einverstanden. Ich benutze groupby wann immer möglich. Aber der Algorithmus in dem Modul, das ich benutze, funktioniert nicht mit groupby wegen eines Fehlers. – PR102012