用熊猫标记每列中的第一个非零元素



我有一个包含概率的大数据帧。

我还有一个系列,它们是阈值。

我想要一个结果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

最新更新