下面的代码遍历 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])