pandas 如何筛选跨列具有相近值的行

g6ll5ycj  于 2022-11-20  发布在  其他
关注(0)|答案(2)|浏览(194)

bounty将在5天后过期。回答此问题可获得+100声望奖励。DN1希望吸引更多人关注此问题。

我在Pandas Dataframe 中有一列概率,作为多类机器学习的输出。
我希望筛选模型在该行的类之间具有非常接近的概率的行,理想情况下,我只关心与该行中的最高值相似的相似值,但我不确定从哪里开始。
例如,我的数据如下所示:

ID    class1  class2  class3  class4  class5
row1   0.97     0.2     0.4     0.3    0.2  
row2   0.97     0.96    0.4     0.3    0.2  
row3   0.7      0.5     0.3     0.4    0.5  
row4   0.97     0.98    0.99    0.3   0.2
row5   0.1      0.2     0.3     0.78   0.8  
row6   0.1     0.11     0.3     0.9    0.2

我想过滤至少2个(或更多)概率类列的概率接近该行中至少一个其他概率列的行(例如,可能在0.05以内)。因此,示例输出将过滤为:

ID    class1  class2  class3  class4  class5
row2   0.97     0.96    0.4     0.3    0.2  
row4   0.97     0.98    0.99    0.3    0.2  
row5   0.1      0.2     0.3     0.78   0.8

我不介意一个过滤器是否包含row6,因为它也满足我〈0.05的主要要求,但理想情况下,因为0.05的差异不是最大的概率,我也宁愿忽略它。
如何开发这样的过滤器?
示例数据:
编辑:我增加了示例数据的大小,因为我并不需要特定的对,而是任何和所有在其行内其列值为2或更多概率具有接近值的行

d = {'ID': ['row1', 'row2', 'row3', 'row4', 'row5', 'row6'], 
'class1': [0.97, 0.97, 0.7, 0.97, 0.1, 0.1], 
'class2': [0.2, 0.96, 0.5, 0.98, 0.2, 0.11], 
'class3': [0.4, 0.4, 0.3, 0.2, 0.3, 0.3], 
'class4': [0.3, 0.3, 0.4, 0.3, 0.78, 0.9], 
'class5': [0.2, 0.2, 0.5, 0.2, 0.8, 0.2]}

df = pd.DataFrame(data=d)
64jmpszr

64jmpszr1#

下面是一个使用numpyitertools.combinations来获取至少N与0.05匹配的相似行对的示例:

from itertools import combinations
import numpy as np

df2 = df.set_index('ID')

N = 2

out = [(a, b) for a,b in combinations(df2.index, r=2)
       if np.isclose(df2.loc[a], df2.loc[b], atol=0.05).sum()>=N]

输出量:

[('row1', 'row2'), ('row1', 'row4'), ('row2', 'row4')]
随访

我的真实的数据是10,000行,我想筛选出具有多列彼此接近的概率的所有行。

from itertools import combinations

N = 2

df2 = df.set_index('ID')

keep = set()
seen = set()

for a,b in combinations(df2.index, r=2):
    if {a,b}.issubset(seen):
        continue
    if np.isclose(df2.loc[a], df2.loc[b], atol=0.05).sum()>=N:
        keep.update({a, b})
    seen.update({a, b})
    
print(keep)
# {'row1', 'row2', 'row4'}
yb3bgrhw

yb3bgrhw2#

您可以通过以下方式实现此目的:

  • 转置 Dataframe 以将每个样本作为列,将概率类作为行。
  • 如果两个最大值之间的差值小于或等于0.05,则可以检查最低要求。
df = pd.DataFrame(data=d).set_index("ID").T

result = [col for col in df.columns if np.isclose(*df[col].nlargest(2), atol=0.05)]

输出:

['row2', 'row4', 'row5']'

转置后的 Dataframe :

ID     row1    row2    row3  row4  row5    row6
class1  0.97    0.97    0.7   0.97  0.10    0.10
class2  0.20    0.96    0.5   0.98  0.20    0.11
class3  0.40    0.40    0.3   0.20  0.30    0.30
class4  0.30    0.30    0.4   0.30  0.75    0.90
class5  0.20    0.20    0.5   0.20  0.80    0.20

相关问题