【问题标题】:Pandas convert a column containing strings into new columnsPandas 将包含字符串的列转换为新列
【发布时间】:2023-02-01 02:14:25
【问题描述】:

我有一个包含逗号分隔字符串的列的数据框。我想创建类似于一种热编码的新列。

下面是一个非常简单的例子。在我的用例中,我有数千行和更多列,两列包含逗号分隔许多字符串。我本可以使用 apply+lamda function+string contains condition 来创建每一列,但这非常乏味,因为它将有 100 多个新列

输入数据帧

ColumnA    ColumnB
 1         {"alpha", "bravo"} 
 2         {"bravo", "charlie"}
 3         {"alpha", "charlie","gama"}
 4         {"bravo", "charlie","delta"}

输出数据框

ColumnA    alpha     bravo   charlie delta gamma  
 1         1         1       0       0     0       
 2         0         1       0       0     0
 3         1         0       1       0     1
 4         0         1       1       1     0

【问题讨论】:

  • 看起来不像逗号分隔的字符串,{/"/} 是字符串的一部分吗? df.head().to_dict('list') 的输出是什么?

标签: python pandas dataframe one-hot-encoding


【解决方案1】:

另一种可能的解决方案:

aux = df['ColumnB'].str.extractall(r'(w+)').reset_index()
pd.concat([df['ColumnA'], pd.crosstab(aux['level_0'], aux[0])], axis=1)

输出:

   ColumnA  alpha  bravo  charlie  delta  gama
0        1      1      1        0      0     0
1        2      0      1        1      0     0
2        3      1      0        1      0     1
3        4      0      1        1      1     0

【讨论】:

  • 不错,但只适用于完整的单词;)+1注意。不要reset_index,而是droplevel(1),因为如果这不是范围索引,您希望保持原始级别。
  • 谢谢@mozway 评论我的回答!你是对的:如果引号之间有空格,我的方法就不起作用。我将尝试改进它。
【解决方案2】:

假设你真的有集合的字符串表示,首先删除{"/"}和内部", ",然后使用str.get_dummies

out = (df.drop(columns='ColumnB')
         .join(df['ColumnB'].str.replace('^{"|"(,)s*"|"}$', r'', regex=True)
                            .str.get_dummies(sep=',')
               )
        )

输出:

   ColumnA  alpha  bravo  charlie  delta  gama
0        1      1      1        0      0     0
1        2      0      1        1      0     0
2        3      1      0        1      0     1
3        4      0      1        1      1     0

选择

类似于@PaulS 的方法,但使用ast.literal_eval

from ast import literal_eval
s = df['ColumnB'].apply(literal_eval).explode()
out = df.drop(columns='ColumnB').join(pd.crosstab(s.index, s))

【讨论】:

  • 你的方式也很好,@mozway。 +1。
  • 如果有其他类型的引号或内部逗号,@PaulS 第一个也有缺陷。第二个(类似于你的)应该更健壮(前提是语法有效!)
猜你喜欢
  • 2013-07-16
  • 2019-07-26
  • 2016-10-30
  • 2022-10-23
  • 2022-06-15
  • 2018-11-23
  • 2016-08-30
  • 2020-10-22
  • 2014-09-30
相关资源
最近更新 更多