扭转熊猫中的"一热"编码

Pea*_*yle 21 python numpy dataframe pandas

问题陈述 我想从这个基本上是热编码的数据帧开始.

 In [2]: pd.DataFrame({"monkey":[0,1,0],"rabbit":[1,0,0],"fox":[0,0,1]})

    Out[2]:
       fox  monkey  rabbit
    0    0       0       1
    1    0       1       0
    2    1       0       0
    3    0       0       0
    4    0       0       0
Run Code Online (Sandbox Code Playgroud)

对于这个"反向"单热编码的那个.

    In [3]: pd.DataFrame({"animal":["monkey","rabbit","fox"]})
    Out[3]:
       animal
    0  monkey
    1  rabbit
    2     fox
Run Code Online (Sandbox Code Playgroud)

我想有一些聪明的使用apply或zip来做这些但是我不确定怎么样......有人可以帮忙吗?

我没有成功使用索引等来尝试解决这个问题.

Max*_*axU 32

更新:我认为ayhan是对的,它应该是:

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

演示:

In [40]: s = pd.Series(['dog', 'cat', 'dog', 'bird', 'fox', 'dog'])

In [41]: s
Out[41]:
0     dog
1     cat
2     dog
3    bird
4     fox
5     dog
dtype: object

In [42]: pd.get_dummies(s)
Out[42]:
   bird  cat  dog  fox
0   0.0  0.0  1.0  0.0
1   0.0  1.0  0.0  0.0
2   0.0  0.0  1.0  0.0
3   1.0  0.0  0.0  0.0
4   0.0  0.0  0.0  1.0
5   0.0  0.0  1.0  0.0

In [43]: pd.get_dummies(s).idxmax(1)
Out[43]:
0     dog
1     cat
2     dog
3    bird
4     fox
5     dog
dtype: object
Run Code Online (Sandbox Code Playgroud)

老答案:(最有可能,答案不正确)

试试这个:

In [504]: df.idxmax().reset_index().rename(columns={'index':'animal', 0:'idx'})
Out[504]:
   animal  idx
0     fox    2
1  monkey    1
2  rabbit    0
Run Code Online (Sandbox Code Playgroud)

数据:

In [505]: df
Out[505]:
   fox  monkey  rabbit
0    0       0       1
1    0       1       0
2    1       0       0
3    0       0       0
4    0       0       0
Run Code Online (Sandbox Code Playgroud)

  • 不应该是`df.idxmax(axis = 1)`? (3认同)

小智 6

我将使用apply来解码列:

In [2]: animals = pd.DataFrame({"monkey":[0,1,0,0,0],"rabbit":[1,0,0,0,0],"fox":[0,0,1,0,0]})

In [3]: def get_animal(row):
   ...:     for c in animals.columns:
   ...:         if row[c]==1:
   ...:             return c

In [4]: animals.apply(get_animal, axis=1)
Out[4]: 
0    rabbit
1    monkey
2       fox
3      None
4      None
dtype: object
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法在存在多个标签的情况下执行此操作,并返回每行的标签列表? (2认同)

Sud*_*n D 5

这适用于单个和多个标签。

我们可以使用高级索引来解决这个问题。是链接。

import pandas as pd

df = pd.DataFrame({"monkey":[1,1,0,1,0],"rabbit":[1,1,1,1,0],\
    "fox":[1,0,1,0,0], "cat":[0,0,0,0,1]})

df['tags']='' # to create an empty column

for col_name in df.columns:
    df.ix[df[col_name]==1,'tags']= df['tags']+' '+col_name

print df
Run Code Online (Sandbox Code Playgroud)

结果是:

   cat  fox  monkey  rabbit                tags
0    0    1       1       1   fox monkey rabbit
1    0    0       1       1       monkey rabbit
2    0    1       0       1          fox rabbit
3    0    0       1       1       monkey rabbit
4    1    0       0       0                 cat
Run Code Online (Sandbox Code Playgroud)

说明:我们遍历数据帧上的列。

df.ix[selection criteria, columns to write value] = value
df.ix[df[col_name]==1,'tags']= df['tags']+' '+col_name
Run Code Online (Sandbox Code Playgroud)

上面的行基本上可以找到 df[col_name] == 1 的所有位置,选择列 'tags' 并将其设置为 df['tags']+' '+ col_name 的 RHS 值

注意: .ix自 Pandas v0.20 以来已被弃用。您应该改用.loc.iloc,视情况而定。