2017-07-08 4 views
1

Ich versuche mehrere Spalten aus mehreren Spalten in einem Pandas Datenrahmen mit einer Funktion zu berechnen. Die Funktion akzeptiert drei Argumente -a-, -b- und -c- und gibt drei berechnete Werte -sum-, -prod- und -quot- zurück. In meinem pandas Datenrahmen habe ich drei counns -a-, -b- und und -c, von denen ich die Spalten -sum-, -prod- und -quot- berechnen möchte.Wie berechnet man mehrere Spalten aus mehreren Spalten in Pandas

Die Zuordnung, die ich mache funktioniert nur, wenn ich genau drei Zeilen habe. Ich weiß nicht, was schief läuft, obwohl ich erwarte, dass es etwas mit der Auswahl der richtigen Achse zu tun hat. Könnte jemand erklären, was passiert und wie ich die Werte berechnen kann, die ich gerne hätte? Unten sind die Situationen, die ich getestet habe.

Anfangswerte

def sum_prod_quot(a,b,c): 
    sum = a + b + c 
    prod = a * b * c 
    quot = a/b/c 
    return (sum, prod, quot) 

df = pd.DataFrame({ 'a': [20, 100, 18], 
        'b': [ 5, 10, 3], 
        'c': [ 2, 10, 6], 
        'd': [ 1, 2, 3] 
       }) 

df 
    a b c d 
0 20 5 2 1 
1 100 10 10 2 
2 18 3 6 3 

Berechnungsschritte

Mit genau drei Reihen

Als ich drei Spalten aus diesem Datenrahmen berechnen und mit der Funktion Funktion erhalte ich:

Dies ist genau das Ergebnis, das ich haben möchte: Die Summenspalte hat die Summe der Elemente in den Spalten a, b, c; Die Prod-Spalte hat das Produkt der Elemente in den Spalten a, b, c und die Quot-Spalte hat die Quotienten der Elemente in den Spalten a, b, c.

Verwendung von mehr als drei Reihen

Wenn ich den Datenrahmen mit einer Reihe erweitern, bekomme ich einen Fehler!

wird der Datenrahmen wie folgt definiert:

... 
    list(map(sum_prod_quot, df['a'], df['b'], df['c'])) 
ValueError: too many values to unpack (expected 3) 

df = pd.DataFrame({ 'a': [20, 100, 18, 40], 
        'b': [ 5, 10, 3, 10], 
        'c': [ 2, 10, 6, 4], 
        'd': [ 1, 2, 3, 4] 
       }) 
df 
    a b c d 
0 20 5 2 1 
1 100 10 10 2 
2 18 3 6 3 
3 40 10 4 4 

Der Anruf ist

df['sum'], df['prod'], df['quot'] = \ 
     list(map(sum_prod_quot, df['a'], df['b'], df['c'])) 

Das Ergebnis ist

während ich würde eine zusätzliche Zeile erwarten:

df 
    a b c d sum  prod quot 
0 20 5 2 1 27.0 120.0 27.0 
1 100 10 10 2 200.0 10000.0 324.0 
2 18 3 6 3 2.0  1.0 1.0 
3 40 10 4 4 54.0 1600.0 1.0 

Verwendung von weniger als drei Reihen

Als ich tthe Datenrahmen mit einer Reihe reduziere ich auch einen Fehler. Der Datenrahmen ist definiert als:

df = pd.DataFrame({ 'a': [20, 100], 
        'b': [ 5, 10], 
        'c': [ 2, 10], 
        'd': [ 1, 2] 
       }) 
df 
    a b c d 
0 20 5 2 1 
1 100 10 10 2 

Der Anruf ist

df['sum'], df['prod'], df['quot'] = \ 
     list(map(sum_prod_quot, df['a'], df['b'], df['c'])) 

Das Ergebnis

... 
    list(map(sum_prod_quot, df['a'], df['b'], df['c'])) 
ValueError: need more than 2 values to unpack 

ist, während ich eine Reihe weniger erwarten würde:

df 
    a b c d sum  prod quot 
0 20 5 2 1 27.0 120.0 27.0 
1 100 10 10 2 200.0 10000.0 324.0 

FRAGEN

Die Fragen, die ich habe:

1) Warum erhalte ich diese Fehlermeldung?

2) Wie muss ich den Anruf ändern, damit ich den gewünschten Datenrahmen bekomme?

HINWEIS

In this link wird eine ähnliche Frage gestellt, aber die gegebene Antwort für mich nicht funktioniert hat.

+0

folgen Sind Sie sicher, dass Ihre Antwort richtig ist? Können Sie auch die Produktspalte überprüfen? – 0p3n5ourcE

+0

Es gibt einen einfacheren Weg, dies zu tun: df ['sum'] = df ['a'] + df ['b'] + df ['c'] 'und dasselbe für die anderen Operationen. Es sei denn, dies ist nur ein Beispiel für den Fehler – DJK

+0

Danke für den Vorschlag. Das obige ist ein Beispiel, um den Fehler zu zeigen. Die ursprüngliche Funktion ist eine Funktion in einem anderen Modul. Die Lösung von Open-Source macht's möglich. – PeterDev

Antwort

2

Die Antwort scheint nicht korrekt für 3 Zeilen auch. Können Sie andere Werte außer first row and first column überprüfen? Betrachtet man die Ergebnisse, ist das Produkt 20*5*2NICHT120, es ist 200 und ist unten in sum Spalte platziert. Sie müssen die Liste korrekt erstellen, bevor Sie neue Spalten zuweisen. Sie können Gebrauch machen folgende versuchen die neuen Spalten zu setzen:

df['sum'], df['prod'], df['quot'] = zip(*map(sum_prod_quot, df['a'], df['b'], df['c'])) 

Einzelheiten der link

+1

Dies ist genau die Linie, nach der ich gesucht habe. Vielen Dank. Es funktioniert auch mit der ursprünglichen Funktion (die in einem anderen Modul platziert ist), wo ich Polarkoordinaten aus rechtwinkligen Koordinaten berechnen muss. – PeterDev

+0

@PeterDev Großartig! Wenn Sie möchten, können Sie die Antwort akzeptieren. 'Glückliche Kodierung'. – 0p3n5ourcE

Verwandte Themen