将矩阵中的值与阈值进行比较,并创建一个超过阈值的列表

时间:2019-07-11 11:01:02

标签: python pandas

我需要将矩阵中的值与阈值进行比较,并创建一个表,该表不仅具有索引,而且还具有值超过阈值的列名。

例如。

原始表:

enter image description here

需要创建一个超过阈值的 Id_Class 列表, 但是我想在将它们发送到列表之前先准备一个中间二进制矩阵。

像这样

enter image description here

和最终名单

enter image description here

我已经尝试使用代码创建二进制矩阵,但是它不起作用。

import pandas as pd
df = pd.DataFrame({'id':[1,2,3],
           'region':['a','b','c'],
           'threshold':[0.4, 0.5, 0.3],
           'class_1':[0.2, 0.3, 0.3],
           'class_2':[0.6, 0.2, 0.1],
           'class_3':[0.4, 0.6, 0.1]})

df1 = df.set_index(['id', 'region', 'threshold'])
df1=df1.where(df1 >=df['threshold'] , 1, 0).reset_index()

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

比较具有广播和布尔掩码的numpy数组转换为整数:

df.iloc[:, 3:] = (df.iloc[:, 3:].values >= df['threshold'].values[:, None]).astype(int)
print (df)
   id region  threshold  class_1  class_2  class_3
0   1      a        0.4        0        1        1
1   2      b        0.5        0        0        1
2   3      c        0.3        1        0        0

另一种解决方案:

arr = (df.iloc[:, 3:].values >= df['threshold'].values[:, None]).astype(int)
print (arr)
[[0 1 1]
 [0 0 1]
 [1 0 0]]

df = df.iloc[:, :3].join(pd.DataFrame(arr, columns=df.columns[3:], index=df.index))
print (df)
   id region  threshold  class_1  class_2  class_3
0   1      a        0.4        0        1        1
1   2      b        0.5        0        0        1
2   3      c        0.3        1        0        0

对于具有1值的列,请使用DataFrame.stack进行整形:

df2 = (df.set_index('id')
         .iloc[:, 2:]
         .stack()
         .rename_axis(('id','class'))
         .reset_index(name='a')
         .query('a == 1')
         .drop('a', 1))
print (df2)
   id    class
1   1  class_2
2   1  class_3
5   2  class_3
6   3  class_1