2017-04-12 51 views
2

我一直在玩熊貓幾個小時,我想知道是否有另一種更快的方式來添加一個額外的列到表中,其中包括該行的平均值?我正在創建一個包含平均值的新列表,然後我將其納入數據框架中。使用熊貓和numpy的平均指標表

這是我的代碼:

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 

回答

3

嘗試df.mean(1)assigndf.mean(1)告訴熊貓計算沿axis=1(行)的平均值。 axis=0是默認值。

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

這產生了df的副本,並增加了一列。

爲了改變現有數據幀

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

演示

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

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

謝謝你,晚安!簡單得多! – user2822693

2

甲NumPy的解決方案將是與性能的基本陣列數據進行工作 -

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

要選擇特定列,像'A''B' -

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

運行測試 -

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