【发布时间】:2021-02-02 01:07:42
【问题描述】:
我有一个df 填充了一个对称的数据矩阵。现在我想提取高于某个值的数据标签(数据位置)。在正常的“for-loop”思维中,我会做这样的事情:
for j in range(df.shape[0]):
for i in range(j):
if (df.iloc[j, i] >= value):
print(df.index.values[i]) #do something
print(df.index.values[j])
我有两个 for 循环的方法,效果非常好。问题在于它太慢了。数据大小可能会有所不同,并且有数百或数千列和行。因此我想使用一种有效的方式来处理数据:
import pandas as pd
import numpy as np
from scipy.spatial.distance import squareform
value = 0.6
df = pd.DataFrame(squareform(np.random.rand(10)))
print(df)
result = []
for j in range(df.shape[0]):
result = np.where(value <= df.loc[j, :])
for element in range(len(result[0])):
print(result[0][element]) # do something
这基本上有效。但是我现在的问题是我不明白如何忽略矩阵的一个对称侧,因为我只需要一半的矩阵来进一步推进。
numpy.where() 确实加快了这个过程,但它让我有些困惑,因为它读出了一整行 df 并且我不知道如何进行探索。如果我使用result,我会得到双重职位,因为这是不必要的。
可能有什么我没看到的吗?或者也许是更好的方法?
提前致谢
【问题讨论】:
-
你的意思是 numpy ndenumerate 吗? numpy.org/doc/stable/reference/generated/numpy.ndenumerate.html
-
这个建议不错,但并没有解决矩阵中值对称的问题
-
按索引条件 j >= i ,可以忽略一个对称边
标签: python pandas numpy vectorization