如何将逗号分隔的文本拆分为熊猫数据框上的列?

我有一个数据框,其中一列的项目用逗号分隔。看起来像:

数据
a,b,c
a,c,d
d,e
a,e
a,b,c,d,e

我的目标是创建一个矩阵,该矩阵的标题是 Data 列中的所有唯一值,意思是 [a,b,c,d,e]。然后作为行的标志,指示该值是否位于该特定行。矩阵应如下所示:

数据 一个 c d 电子
a,b,c 1 1 1 0 0
a,c,d 1 0 1 1 0
d,e 0 0 0 1 1
a,e 1 0 0 0 1
a,b,c,d,e 1 1 1 1 1

要分离列数据,我所做的是:

df['data'].str.split(',', expand = True)

然后我不知道如何继续将标志分配给每一列。

stack overflow How to split comma separated text into columns on pandas dataframe?
原文答案
author avatar

接受的答案

也许你可以在没有枢轴的情况下尝试这个。

创建数据框。

import pandas as pd
import io

s = '''Data
a,b,c
a,c,d
d,e
a,e
a,b,c,d,e'''

df = pd.read_csv(io.StringIO(s), sep = "s+")

我们可以使用 pandas.Series.str.splitexpand 参数等于 True 。并且 value_counts 每行带有 axis = 1

最后将 fillna 设为零,并使用 astype(int) 将数据更改为整数。

df["Data"].str.split(pat = ",", expand=True).apply(lambda x : x.value_counts(), axis = 1).fillna(0).astype(int)

#
    a   b   c   d   e
0   1   1   1   0   0
1   1   0   1   1   0
2   0   0   0   1   1
3   1   0   0   0   1
4   1   1   1   1   1

然后将其与原始列合并。

new = df["Data"].str.split(pat = ",", expand=True).apply(lambda x : x.value_counts(), axis = 1).fillna(0).astype(int)
pd.concat([df, new], axis = 1)

#
    Data        a   b   c   d   e
0   a,b,c       1   1   1   0   0
1   a,c,d       1   0   1   1   0
2   d,e         0   0   0   1   1
3   a,e         1   0   0   0   1
4   a,b,c,d,e   1   1   1   1   1

答案:

作者头像

使用 Series.str.get_dummies() 方法返回所需的 'a'、'b'、...'e' 列矩阵。

df["Data"].str.get_dummies(sep=',')
作者头像

如果您将字符串拆分为列表,然后将它们分解,则可以使枢轴成为可能。

(df.assign(data_list=df.Data.str.split(','))
   .explode('data_list')
   .pivot_table(index='Data',
                columns='data_list',
                aggfunc=lambda x: 1,
                fill_value=0))

输出

data_list  a  b  c  d  e
Data                    
a,b,c      1  1  1  0  0
a,b,c,d,e  1  1  1  1  1
a,c,d      1  0  1  1  0
a,e        1  0  0  0  1
d,e        0  0  0  1  1
作者头像

您可以为每个键应用自定义计数功能:

for k in ["a","b","c","d","e"]:
    df[k] = df.apply(lambda row: row["Data"].count(k), axis=1)