使用pandas将字符串列转换为多个布尔列

4

我有一个两列的数据集,我想要将其重新塑形。
看这个虚假数据框:

df=pd.DataFrame([
    ['Alex', 'Apple'],['Bob', 'Banana'],['Clark', 'Citrus'], ['Diana', 'Banana'], [
'Elisa', 'Apple'], ['Frida', 'Citrus'], ['George', 'Citrus'], ['Hanna', 'Banana']
],columns=['Name', 'Fruit'])

我希望有四列,名称、苹果、香蕉和柑橘,后三个是布尔类型(真/假)。 我已经尝试使用unstack函数,但它并不是我需要的。
3个回答

5

我认为这应该是 get_dummies 的一个很好的使用案例:

df.set_index('Name')['Fruit'].str.get_dummies().astype(bool).reset_index()

     Name  Apple  Banana  Citrus
0    Alex   True   False   False
1     Bob  False    True   False
2   Clark  False   False    True
3   Diana  False    True   False
4   Elisa   True   False   False
5   Frida  False   False    True
6  George  False   False    True
7   Hanna  False    True   False

同样地,我们有:
pd.concat([df['Name'], df['Fruit'].str.get_dummies().astype(bool)], axis=1)

     Name  Apple  Banana  Citrus
0    Alex   True   False   False
1     Bob  False    True   False
2   Clark  False   False    True
3   Diana  False    True   False
4   Elisa   True   False   False
5   Frida  False   False    True
6  George  False   False    True
7   Hanna  False    True   False

太好了!谢谢 - 我还是 Python 新手(我是一个 R 女孩)。你不知道如何从新的 df 中创建一个矩阵,其中 True/false 是 1/0 吗? - Mactilda
@Mactilda,请在我的代码中删除 astype(bool)。我以为你想要 True/False,因为你提到了布尔值,但用 0/1 表示结果更直接。 - cs95
谢谢!我知道如何删除第一列,但有没有办法同时删除列标题以将其转换为矩阵? - Mactilda
@Mactilda 你需要一个没有列名的数组或DataFrame吗?如果是前者,你可以使用anky_91的建议。否则,请执行 df.columns = range(len(df.columns)) - cs95
1
@Mactilda 另外,我在这里有一个答案(https://dev59.com/tGYs5IYBdhLWcg3wDPit#54508052),解释了如何将DataFrame转换为矩阵。 - cs95
@coldspeed 我有一个相关的问题,似乎找不到答案。如果我想要一个x,其中所有真实值都存在,而假值则不存在 - 是否有一个简单的命令可以实现这个功能? - Mactilda

4
您可以使用以下内容:
df[['Name']].join(pd.get_dummies(df.Fruit).astype(bool))

     Name  Apple  Banana  Citrus
0    Alex   True   False   False
1     Bob  False    True   False
2   Clark  False   False    True
3   Diana  False    True   False
4   Elisa   True   False   False
5   Frida  False   False    True
6  George  False   False    True
7   Hanna  False    True   False

我看到我们有相同的想法了... +1 - cs95
1
@coldspeed 是的。 :D 我也+1了你的。 - anky
1
谢谢!你们俩都非常快 :) - Mactilda
@Mactilda 没问题。干杯..!! - anky

4

看起来crosstab没问题

pd.crosstab(df.Name,df.Fruit).astype(bool).reset_index()
Out[90]: 
Fruit    Name  Apple  Banana  Citrus
0        Alex   True   False   False
1         Bob  False    True   False
2       Clark  False   False    True
3       Diana  False    True   False
4       Elisa   True   False   False
5       Frida  False   False    True
6      George  False   False    True
7       Hanna  False    True   False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接