最初的问题如下:我有一个初始矩阵,比方说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是否更好。
答案 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