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.
folgen Sind Sie sicher, dass Ihre Antwort richtig ist? Können Sie auch die Produktspalte überprüfen? – 0p3n5ourcE
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
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