在迭代 Pandas 数据帧时避免嵌套循环,并对项目有条件



下面的代码遍历 Pandas 数据帧的每个成员,询问项目的绝对值是否为>= 0.5,如果是,则将其值与相应的列名和行名一起追加到列表中:

record = []
for i in range(df.shape[0]):
for j in range(df.shape[1]):
if abs(df.iloc[i, j]) >= 0.5:
record.append([df.columns[j], df.index[i], df.iloc[i, j]])

当然,根据数据帧大小,这可能需要一些时间,因为执行这些嵌套循环的效率非常低......

有没有更好、更快、更 pythonic 的方法可以做到这一点?

示例输入:

colA  colB  colC  colD
row1  -0.7   0.3   0.6  -0.2
row2   0.4  -0.3   0.8  -0.9

示例输出:

[['colA', 'row1', -0.7],
['colC', 'row1', 0.6],
['colC', 'row2', 0.8],
['colD', 'row2', -0.9]]

这是mask整个 df 值的一种方法,然后stack

df.where(df.abs()>0.5).stack().reset_index().values.tolist()

使用 numpy。将熊猫数据框的值转换为 numpy:

import numpy as np
A = df.to_numpy()  

对于数据,我首先随机生成它们,然后挑选出大于 0.5 的数据:

A = np.random.randn(3, 6)
B = A[A>=0.5]
B
array([0.87244799, 1.35438111, 1.18743473, 0.65015131, 0.71182848,
0.85945553, 2.02416415, 0.53008776])

相关内容

  • 没有找到相关文章

最新更新