在pandas中反转get_dummies编码

Muk*_*ndS 10 python dataframe pandas

列名是:ID,1,2,3,4,5,6,7,8,9.

col值为0或1

我的数据框看起来像这样:

 ID     1    2    3    4    5    6   7   8   9 

1002    0    1    0    1    0    0   0   0   0
1003    0    0    0    0    0    0   0   0   0 
1004    1    1    0    0    0    0   0   0   0
1005    0    0    0    0    1    0   0   0   0
1006    0    0    0    0    0    1   0   0   0
1007    1    0    1    0    0    0   0   0   0
1000    0    0    0    0    0    0   0   0   0
1009    0    0    1    0    0    0   1   0   0
Run Code Online (Sandbox Code Playgroud)

我想要列前面的列名称,其中行中的值为1.

我想要的Dataframe应该如下所示:

 ID      Col2
1002       2    // has 1 at Col(2) and Col(4)
1002       4    
1004       1    // has 1 at col(1) and col(2)
1004       2
1005       5    // has 1 at col(5)
1006       6    // has 1 at col(6)
1007       1    // has 1 at col(1) and col(3)
1007       3
1009       3    // has 1 at col(3) and col(7)
1009       7
Run Code Online (Sandbox Code Playgroud)

请帮助我,提前谢谢

Zee*_*tel 18

漂亮的单线:)

new_df = df.idxmax(axis=1)
Run Code Online (Sandbox Code Playgroud)


小智 9

OP 帖子的几个很好的答案。但是,通常get_dummies用于多个分类特征。Pandas 使用前缀分隔符prefix_sep来区分列的不同值。

以下函数折叠“虚拟”数据框,同时保持列的顺序:

def undummify(df, prefix_sep="_"):
    cols2collapse = {
        item.split(prefix_sep)[0]: (prefix_sep in item) for item in df.columns
    }
    series_list = []
    for col, needs_to_collapse in cols2collapse.items():
        if needs_to_collapse:
            undummified = (
                df.filter(like=col)
                .idxmax(axis=1)
                .apply(lambda x: x.split(prefix_sep, maxsplit=1)[1])
                .rename(col)
            )
            series_list.append(undummified)
        else:
            series_list.append(df[col])
    undummified_df = pd.concat(series_list, axis=1)
    return undummified_df

Run Code Online (Sandbox Code Playgroud)

例子

>>> df
     a    b    c
0  A_1  B_1  C_1
1  A_2  B_2  C_2
>>> df2 = pd.get_dummies(df)
>>> df2
   a_A_1  a_A_2  b_B_1  b_B_2  c_C_1  c_C_2
0      1      0      1      0      1      0
1      0      1      0      1      0      1
>>> df3 = undummify(df2)
>>> df3
     a    b    c
0  A_1  B_1  C_1
1  A_2  B_2  C_2
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

set_index+ stack,默认情况下栈会掉落

df.set_index('ID',inplace=True)

df[df==1].stack().reset_index().drop(0,1)
Out[363]: 
     ID level_1
0  1002       2
1  1002       4
2  1004       1
3  1004       2
4  1005       5
5  1006       6
6  1007       1
7  1007       3
8  1009       3
9  1009       7
Run Code Online (Sandbox Code Playgroud)