使用pandas和numpy平均表的索引

时间:2017-04-12 22:14:55

标签: python pandas 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

2 个答案:

答案 0 :(得分:3)

使用df.mean(1)尝试assigndf.mean(1)告诉pandas计算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

答案 1 :(得分: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