【问题标题】:Efficient nested looping with pandas dataframe使用 pandas 数据框的高效嵌套循环
【发布时间】:2017-08-22 18:51:21
【问题描述】:

我有一个像这样的简单熊猫数据框:

d = {'col1': ['a','b','c','d','e'], 'col2': [1,2,3,4,5]}
df = pd.DataFrame(d)
df
  col1  col2
0    a     1
1    b     2
2    c     3
3    d     4
4    e     5

我需要对其进行迭代,并为所有行值组合获得一个简单的算术结果(如乘积左右)。我正在考虑制作一个矩阵并将值放入,如下所示:

size = df.shape[0]
mtx = np.zeros(shape=(size, size))
mtx
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

但我以某种方式“感觉到”有比嵌套循环更有效的方法,如下所示:

for index1, c11, c12, in df.itertuples():
    for index2, c21, c22 in df.itertuples():
        mtx[index1][index2] = float(c12) * float(c22)

mtx
array([[  1.,   2.,   3.,   4.,   5.],
       [  2.,   4.,   6.,   8.,  10.],
       [  3.,   6.,   9.,  12.,  15.],
       [  4.,   8.,  12.,  16.,  20.],
       [  5.,  10.,  15.,  20.,  25.]])

任何想法将不胜感激!谢谢!

【问题讨论】:

    标签: python pandas numpy iteration


    【解决方案1】:

    对于*,+,-,/ 之类的操作,您可以执行以下操作:(此示例适用于*,但如果您需要+,-/,您可以更改最后一行的操作)

    import numpy as np
    import pandas as pd
    d = {'col1': ['a','b','c','d','e'], 'col2': [1,2,3,4,5]}
    df = pd.DataFrame(d)
    a=np.array([df.col2.tolist()])
    a.T*a
    

    结果是:

    array([[ 1,  2,  3,  4,  5],
       [ 2,  4,  6,  8, 10],
       [ 3,  6,  9, 12, 15],
       [ 4,  8, 12, 16, 20],
       [ 5, 10, 15, 20, 25]], dtype=int64)
    

    a.T*a 更改为a.T+a 以获得成对的总和,将a.T-a 更改为成对的差值。如果要成对除法,可以改成a.T/a,但记得在操作上面加上a=a.astype(float)这行。

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      相关资源
      最近更新 更多