2017-04-12 5 views
2

Ich habe jetzt für ein paar Stunden mit Pandas gespielt, ich frage mich, ob es eine weitere schnellere Möglichkeit gibt, eine zusätzliche Spalte zu Ihrer Tabelle hinzuzufügen, die aus dem Durchschnitt dieser Reihe besteht? Ich erstelle eine neue Liste, die den Mittelwert enthält, und ich füge ihn dann in den Datenrahmen ein.Mittelwerte von Tabellen mit Pandas und Numpy

Dies ist mein Code:

import numpy as np 
import pandas as pd 
userdata={"A":[2,5],"B":[4,6]} 
tab=pd.DataFrame((userdata), columns=["A","B"]) 
lst=[np.mean([tab.loc[i,"A"],tab.loc[i,"B"]]) for i in range(len(tab.index))] 
tab["Average of A and B"]=pd.DataFrame(lst) 
tab 

Antwort

3

versuchen df.mean(1) mit assign. df.mean(1) sagt Pandas, um den Mittelwert entlang axis=1 (Zeilen) zu berechnen. axis=0 ist die Standardeinstellung.

df.assign(Mean=df.mean(1)) 

Dies ergibt eine Kopie von df mit hinzugefügter Spalte.

Um den bestehenden Datenrahmen

df['Mean'] = df.mean(1) 

Demo mit den darunterliegenden Array-Daten für die Leistung arbeiten

tab.assign(Mean=tab.mean(1)) 

    A B Mean 
0 2 4 3.0 
1 5 6 5.5 
+0

Danke und gute Nacht! Viel einfacher! – user2822693

2

A NumPy Lösung wäre zu verändern -

tab['average'] = tab.values.mean(1) 

bestimmte Spalten zu wählen, wie 'A' und 'B' -

tab['average'] = tab[['A','B']].values.mean(1) 

Runtime Test -

In [41]: tab = pd.DataFrame(np.random.randint(0,9,(10000,10))) 

# @piRSquared's soln 
In [42]: %timeit tab.assign(Mean=tab.mean(1)) 
1000 loops, best of 3: 615 µs per loop 

In [43]: tab = pd.DataFrame(np.random.randint(0,9,(10000,10))) 

In [44]: %timeit tab['average'] = tab.values.mean(1) 
1000 loops, best of 3: 297 µs per loop 


In [37]: tab = pd.DataFrame(np.random.randint(0,9,(10000,100))) 

# @piRSquared's soln 
In [38]: %timeit tab.assign(Mean=tab.mean(1)) 
100 loops, best of 3: 4.71 ms per loop 

In [39]: tab = pd.DataFrame(np.random.randint(0,9,(10000,100))) 

In [40]: %timeit tab['average'] = tab.values.mean(1) 
100 loops, best of 3: 3.6 ms per loop 
Verwandte Themen