使用numpy数组或pandas简化python中的例程

时间:2016-03-31 18:23:20

标签: python arrays performance numpy pandas

最初的问题如下:我有一个初始矩阵,比方说10行和12行。对于所有行,我想将两行相加。最后我必须有10行,但只有6行。目前,我在python中使用循环进行以下操作(使用initial是一个pandas DataFrame)

for i in range(0,12,2):
  coarse[i]=initial.iloc[:,i:i+1].sum(axis=1)

事实上,我确信可以提高效率。我正在考虑像列表理解这样的东西,但是对于DataFrame或numpy数组。有人有想法吗?

此外,我想知道操作大型numpy数组或pandas DataFrame是否更好。

1 个答案:

答案 0 :(得分:1)

让我们创建一个小样本数据框来说明解决方案:

np.random.seed(0)
df = pd.DataFrame(np.random.rand(6, 3))

>>> df
          0         1         2
0  0.548814  0.715189  0.602763
1  0.544883  0.423655  0.645894
2  0.437587  0.891773  0.963663
3  0.383442  0.791725  0.528895
4  0.568045  0.925597  0.071036
5  0.087129  0.020218  0.832620

您可以使用切片表示法从第一行(::2)开始并从第二行(1::2)开始选择每隔一行。 iloc用于整数索引。您需要在这些位置选择值,然后将它们一起添加。结果是一个numpy数组,如果需要,您可以将其转换回DataFrame。

>>> df.iloc[::2].values + df.iloc[1::2].values
array([[ 1.09369669,  1.13884417,  1.24865749],
       [ 0.82102873,  1.68349804,  1.49255768],
       [ 0.65517386,  0.94581504,  0.9036559 ]])

使用值删除索引。否则会发生这种情况:

>>> df.iloc[::2] + df.iloc[1::2].values
          0         1         2
0  1.093697  1.138844  1.248657
2  0.821029  1.683498  1.492558
4  0.655174  0.945815  0.903656

>>> df.iloc[::2].values + df.iloc[1::2]
          0         1         2
1  1.093697  1.138844  1.248657
3  0.821029  1.683498  1.492558
5  0.655174  0.945815  0.903656

更通用的解决方案:

df = pd.DataFrame(np.random.rand(9, 3))
n = 3  # Number of consecutive rows to group.
df['group'] = [idx // n for idx in range(len(df.index))]

df.groupby('group').sum()
              0         1         2
group                              
0      1.531284  2.030617  2.212320
1      1.038615  1.737540  1.432551
2      1.695590  1.971413  1.902501