Skip to main content
 首页 » 编程设计

python之包含列表的 Pandas 列的 get_dummies

2025年05月04日28虾米姐

假设我有一个 DataFrame,其中有一列包含字符串列表,如下所示:

    Name    Fruit 
0   Curly   [Apple] 
1   Moe     [Orange] 
2   Larry   [Apple, Banana] 

我怎样才能把它变成这样的东西?

    Name     Fruit_Apple   Fruit_Orange   Fruit_Banana 
0   Curly              1              0              0 
1   Moe                0              1              0 
2   Larry              1              0              1 

我觉得我会以某种方式使用 pandas.get_dummies() 但我似乎无法理解。有帮助吗?

请您参考如下方法:

import pandas as pd 
 
df = pd.DataFrame({'Name': ['Curly', 'Moe', 'Larry'], 
                   'Fruit': [['Apple'], ['Orange'], ['Apple', 'Banana']]}, 
                  columns=['Name', 'Fruit']) 
 
# a one-liner... that's pretty long     
dummies_df = pd.get_dummies( 
  df.join(pd.Series(df['Fruit'].apply(pd.Series).stack().reset_index(1, drop=True), 
                    name='Fruit1')).drop('Fruit', axis=1).rename(columns={'Fruit1': 'Fruit'}), 
  columns=['Fruit']).groupby('Name', as_index=False).sum() 
 
print(dummies_df) 

我将把它分解成几个步骤:

第 1 步:

df['Fruit'].apply(pd.Series).stack().reset_index(1, drop=True)

此步骤适用 pd.Series到您的列表,它将列表中的每个项目拆分为一个新列。 stack然后将这些列堆叠成一个列,同时维护重要的索引信息。 reset_index部分重置索引的级别 1 并删除它,因为它不需要。你最终得到这个:

0     Apple 
1    Orange 
2     Apple 
2    Banana 
dtype: object  

第 2 步:

你会注意到 pd.Series( *Step 1 here*, name='Fruit1')包裹在上面的第 1 步代码中,因为接下来我们将把这个系列加入现有的数据框,所以我们需要一个 name为了做到这一点。

第 3 步:

df.join(* steps 1 and 2 code *).drop('Fruit', axis=1).rename(columns={'Fruit1': 'Fruit'}) 

因为我们现在有一个 pd.Series使用名称 ( Fruit1 ),我们加入 Fruit1系列转原df然后有三列。然后我们调用 drop 来删除原来的 Fruit柱子。现在我们只有两列 Name和 Fruit1但我们想要Fruit待命名Fruit所以我们用 rename 重命名它.

第 4 步:

pd.get_dummies(* steps 1, 2, and 3 here*, columns=['Fruit']) 

在这里,我们最终调用了 get_dummies我们使用 columns=['Fruit']专门告诉 get_dummies 只获取 Fruit 列的虚拟对象。

    Name  Fruit_Apple  Fruit_Banana  Fruit_Orange 
0  Curly          1.0           0.0           0.0 
1    Moe          0.0           0.0           1.0 
2  Larry          1.0           0.0           0.0 
2  Larry          0.0           1.0           0.0 

第 5 步:

dummies_df = (*steps 1, 2, 3, and 4*).groupby('Name', as_index=False).sum() 

最后你使用 groupby在 Name 上列并指定 as_index=False可选择不设置 Name作为索引。然后将该结果与 .sum() 求和

最终结果:

    Name  Fruit_Apple  Fruit_Banana  Fruit_Orange 
0  Curly          1.0           0.0           0.0 
1  Larry          1.0           1.0           0.0 
2    Moe          0.0           0.0           1.0