我有这样的浮点数据,这是由3个神经元生成的神经网络输出。我想将其转换为二进制分类标签(互斥),根据每行的最大值来决定。
0.423201 0.368718 0.338091 0.246899 0.437535 0.000262 0.978685 0.136219 0.027693
输出应该为
1 0 00 1 01 0 0
这意味着每一行只能有一个值为1,其余均为0(最大值变为1)。
如何在pandas或Python中实现?我知道pandas中的get_dummies是可行的方法,但它不起作用。
如果可以,请帮助我。
回答:
我认为你可以使用rank
,然后将其与df1
的最大值进行比较。最后通过astype
将布尔DataFrame
转换为int
:
print df 0 1 20 0.423201 0.368718 0.3380911 0.246899 0.437535 0.0002622 0.978685 0.136219 0.027693df1 = df.rank(method='max', axis=1)print df1 0 1 20 3 2 11 2 3 12 3 2 1#get max value of df1ma = df1.max().max()print ma3.0print (df1 == ma) 0 1 20 True False False1 False True False2 True False Falseprint (df1 == ma).astype(int) 0 1 20 1 0 01 0 1 02 1 0 0
编辑:
我认为你可以使用eq
来按行与df
的max
进行比较,最后通过astype
转换为int
:
print df.max(axis=1)0 101 82 9dtype: int64print df.eq(df.max(axis=1), axis=0).astype(int) 0 1 20 1 0 01 0 1 02 1 0 0
性能测试
len(df) = 3
:
In [418]: %timeit df.eq(df.max(axis=1), axis=0).astype(int)最慢的运行时间比最快的运行时间长5.44倍。这可能意味着中间结果被缓存了1000 loops, best of 3: 334 µs per loopIn [419]: %timeit df.apply(lambda x: x == x.max(), axis='columns').astype(int)最慢的运行时间比最快的运行时间长4.49倍。这可能意味着中间结果被缓存了1000 loops, best of 3: 1.44 ms per loopIn [420]: %timeit (df.rank(method='max', axis=1) == df.rank(method='max', axis=1).max().max()).astype(int)最慢的运行时间比最快的运行时间长4.83倍。这可能意味着中间结果被缓存了1000 loops, best of 3: 656 µs per loop
len(df) = 3000
:
In [426]: %timeit df.eq(df.max(axis=1), axis=0).astype(int)最慢的运行时间比最快的运行时间长5.44倍。这可能意味着中间结果被缓存了1000 loops, best of 3: 456 µs per loopIn [427]: %timeit df.apply(lambda x: x == x.max(), axis='columns').astype(int)1 loops, best of 3: 496 ms per loopIn [428]: %timeit (df.rank(method='max', axis=1) == df.rank(method='max', axis=1).max().max()).astype(int)最慢的运行时间比最快的运行时间长4.50倍。这可能意味着中间结果被缓存了1000 loops, best of 3: 1.32 ms per loop