我有一个包含概率的大数据帧。
我还有一个系列,它们是阈值。
我想要一个结果DF,它在每列中最多有一个1,这将是列概率第一次低于相应序列prob的元素。
即,如果我有DF
A B C
0.1 0.7 0.01
0.3 0.05 0.9
0.01 0.01 0.02
以及值为0.02、0.06、0.1的系列然后我想要像一样的输出
A B C
0 0 1
0 1 0
1 0 0
我可以买到类似的东西
A B C
0 0 1
0 1 0
1 1 1
相当容易,但我需要它只有第一个元素,而不是全部。
试用broadcasting
:
给定的阈值系列:
threshold = pd.Series([0.02, 0.06, 0.1])
m = df < threshold.values[:, None]
new_df = pd.DataFrame(
m & (m.index.values[:, None] == m.idxmax().values),
columns=df.columns,
dtype=int
)
A B C
0 0 0 1
1 0 1 0
2 1 0 0
解释:
查找值小于数组值的位置:
df < threshold.values[:, None]
A B C
0 False False True
1 False True False
2 True True True
然后使用idxmax
获得每列true的第一个实例:
m.idxmax()
A 2
B 1
C 0
dtype: int64
然后再次广播以查找其中的值同时为列的True
和最大索引:
m & (m.index.values[:, None] == m.idxmax().values)
[[False False True]
[False True False]
[ True False False]]
最后返回DataFrame:
new_df = pd.DataFrame(
m & (m.index.values[:, None] == m.idxmax().values),
columns=df.columns,
dtype=int
)
A B C
0 0 0 1
1 0 1 0
2 1 0 0