python - 使用 pandas dataframe 进行高效嵌套循环

标签 python pandas numpy iteration

我有一个简单的 Pandas 数据框,如下所示:

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.]])

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

最佳答案

对于像*,+,-,/这样的操作,您可以执行以下操作:(此示例针对*,但您只需更改最后一个操作即可如果您想要 +,-/ 则行)

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)

关于python - 使用 pandas dataframe 进行高效嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43090877/

相关文章:

python - 使用不区分大小写的方式从行名中选择数据帧行(如 `grep -i` )

python-3.x - 如何根据 .CSV map 重命名文件

python - 通过子字符串将 Pandas 系列拆分为多列

python - Pandas 中的数据差距发现(不填补)?

python - 计算一组中的第一个连续比赛

python - 如何在没有互联网访问和搜索可用的情况下制作本地 Pypi 镜像?

python - 将上限和下限应用于 Pandas Dataframe

python - 将数据写入不同工作表中的 xlsx

python - Deepchem磁盘数据到numpy数组

python - 如何设置GtkTextView回车键回调?