我需要将矩阵中的值与阈值进行比较,并创建一个表,该表不仅具有索引,而且还具有值超过阈值的列名。
例如。
原始表:
需要创建一个超过阈值的 Id_Class 列表, 但是我想在将它们发送到列表之前先准备一个中间二进制矩阵。
像这样
和最终名单
我已经尝试使用代码创建二进制矩阵,但是它不起作用。
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()
感谢您的帮助
答案 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