【问题标题】:How to split comma separated text into columns on pandas dataframe?如何将逗号分隔的文本拆分为熊猫数据框上的列?
【发布时间】:2022-10-07 04:19:28
【问题描述】:

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

Data
a,b,c
a,c,d
d,e
a,e
a,b,c,d,e

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

Data a b c d e
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)

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

    标签: python pandas dataframe


    【解决方案1】:

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

    创建数据框。

    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
    

    【讨论】:

      【解决方案2】:

      如果将字符串拆分为列表,然后将它们分解,则可以进行枢轴操作。

      (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
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:
          df["Data"].str.get_dummies(sep=',')
          

          将返回所需的 'a'、'b'、...'e' 列矩阵。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-20
            • 2022-01-21
            • 2023-03-21
            • 2021-12-06
            • 2021-07-02
            • 1970-01-01
            • 2016-09-16
            • 2021-12-27
            相关资源
            最近更新 更多