从单个字符串列创建新的二进制列在pandas中

9 投票
3 回答
13775 浏览
提问于 2025-04-17 23:44

我之前见过这个,但就是想不起来这个函数是什么。

假设我有一列叫“速度”,每一行都有以下这些值:

'Slow', 'Normal', 'Fast'

我该如何创建一个新的数据框,这个数据框里包含所有的行,但不包括“速度”这一列,而是变成3列:“慢”、“正常”和“快”,并且每一行在对应的列里标记一个1,表示原来的“速度”列的值。如果我有:

print df['Speed'].ix[0]
> 'Normal'

我不希望得到这样的结果:

print df['Normal'].ix[0]
>1

print df['Slow'].ix[0]
>0

3 个回答

2

这还有另一种方法:

df           = pd.DataFrame(['Slow','Fast','Normal','Normal'],columns=['Speed'])
df['Normal'] = np.where(df['Speed'] == 'Normal', 1 ,0)
df['Fast']   = np.where(df['Speed'] == 'Fast', 1 ,0)
df['Slow']   = np.where(df['Speed'] == 'Slow', 1 ,0)

df 
     Speed  Normal  Fast  Slow
0    Slow       0     0     1
1    Fast       0     1     0
2  Normal       1     0     0
3  Normal       1     0     1

   

6

这里有一个解决方案:

df['Normal'] = df.Speed.apply(lambda x: 1 if x == "Normal" else 0)
df['Slow'] = df.Speed.apply(lambda x: 1 if x == "Slow" else 0)
df['Fast'] = df.Speed.apply(lambda x: 1 if x == "Fast" else 0)
14

你可以很简单地使用 pd.get_dummies 来实现这个功能,具体的说明可以查看这个链接:docs

In [37]: df = pd.DataFrame(['Slow', 'Normal', 'Fast', 'Slow'], columns=['Speed'])

In [38]: df
Out[38]:
    Speed
0    Slow
1  Normal
2    Fast
3    Slow

In [39]: pd.get_dummies(df['Speed'])
Out[39]:
   Fast  Normal  Slow
0     0       0     1
1     0       1     0
2     1       0     0
3     0       0     1

撰写回答