【问题标题】:simplifying routine in python with numpy array or pandas使用 numpy 数组或 pandas 简化 python 中的例程
【发布时间】:2016-03-31 18:23:19
【问题描述】:

最初的问题如下:我有一个初始矩阵,假设有 10 行和 12 行。对于所有行,我想将两行相加。最后我必须有 10 行但只有 6 行。目前,我正在 python 中执行以下 for 循环(使用作为 pandas DataFrame 的初始)

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

事实上,我很确定更高效的方法是可能的。我正在考虑类似列表理解的东西,但对于 DataFrame 或 numpy 数组。有人有想法吗?

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

【问题讨论】:

  • 您能添加一个示例代表输入吗?
  • 一个数据框有行和列。我假设您对上面“行”的引用实际上是列,因为您明确提到了行。但是,您上面的示例代码正在添加列对。

标签: python arrays performance numpy pandas


【解决方案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

【讨论】:

  • 非常感谢您的回答,问题是对于不同大小的“重组总和”,我必须多次重复此操作。例如,我的矩阵可能有 15 行和 3 列。然后我必须首先计算按 3 分组的行的总和(row0+row1+row2,然后 row3+row4+row5... 直到最后 3 行);第二次我将要重复该操作,但将行按 5 分组(row0+...+row4;...;row10+...+row14)。我希望我足够清楚!您是否知道比我提出的方法更快并且我可以轻松调整分组大小的方法?
  • 非常感谢亚历山大。最后一个问题:你能解释一下“idx // n”是什么意思吗?或者给我一些解释这个的网站?
  • @orpheu 它是整数除法,例如 5 // 2 = 2
猜你喜欢
  • 2017-12-30
  • 2020-08-07
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2013-08-10
  • 2013-08-27
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多