如何在一个热编码的熊猫数据框中找到列的正索引?

时间:2018-12-24 01:20:15

标签: python pandas numpy dataframe

我有一个单编码的熊猫数据框,格式为:

df

.price-block {
    width: 270px;
    min-height: 450px;
    margin-left: 20px;
    text-align: center;
    background-color: #f4f4f4;
    transition: .4s ease-in-out;
}
.price-block:hover {
    background-color: #000;
    color: #fff;
    transform: scale(1.1);
}

.price-block h3 {
    margin-top: 40px;
    margin-bottom: 50px;
    font-size: 20px;
    color: #333;
    letter-spacing: 1px;
    font-weight: 700;
    text-transform: uppercase;
}

我想将其转换为一个新数据框,其中索引为列,并且值对应于旧索引(一种旋转数据框的方式)。我只在寻找那些在原始数据帧中具有正值(对应于计数)的旧索引。实际上, df 应如下所示:

new_df

      A      B      C      D
ID
#1    2      1      0      1
#2    1      0      0      1
#3    1      1      1      0

df = pd.DataFrame({'ID_1':['#1','#1','#3','#1'], 'ID_2':['#2','#3',np.NaN,'#2'], \
          'ID_3':['#3', np.NaN, np.NaN, np.NaN] }, index=['A','B','C','D'])

我了解我需要以某种方式调整数据帧,但我找不到有效的方法来实现此目的。

2 个答案:

答案 0 :(得分:0)

首先使用gt使df成为布尔值,然后使用mul,然后我们按isnull对列进行排序。

df.gt(0).mul(df.index.values,0).T.replace('',np.nan).apply(lambda x : sorted(x,key=pd.isnull),1)
ID  #1   #2   #3
A   #1   #2   #3
B   #1   #3  NaN
C   #3  NaN  NaN
D   #1   #2  NaN

答案 1 :(得分:0)

您可以使用numpy中的argsort来按所需顺序获取值的位置,然后使用mask替换已排序数组中值为0的位置:

import numpy as np
arr = df.values.T
new_df = (pd.DataFrame( data = df.index[np.argsort( -arr, axis=1)].values,
                        index = pd.Index(df.columns,name='c_id'),
                        columns='ID_' + df.index.str[1:])
            .mask(np.sort( -arr, axis=1) == 0,''))

那么你就得到

print(new_df)
     ID_1 ID_2 ID_3
c_id               
A      #1   #2   #3
B      #1   #3     
C      #3          
D      #1   #2