我有一个简单的 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/