【问题标题】:Split a column of values delimited by a space into separate columns for each value in python将由空格分隔的一列值拆分为python中每个值的单独列
【发布时间】:2018-11-01 12:04:48
【问题描述】:

如何转换数据集

a    |    a b c d 
s    |    e f g h
f    |    i j k l

a | a | b | c | d
s | e | f | g | h
f | i | j | k | l

【问题讨论】:

  • 数据集在内存中是如何表示的?是数组吗?
  • 表示为字符串
  • 那么,本质上是这样的吗? dataset = 'a | a b c d \ s | e f g h \ f | i j k l'
  • a 是一个整数。 a, b, c, d 也是整数,但第二列的最终值是一个字符串。即 5 | 120 154 564 5454
  • 这些都是一栏吗?是否 |代表不同的列,你希望结果是一个字符串,还是单独的列?

标签: python pandas split data-cleaning


【解决方案1】:

更简单的方法是使用expand=True 参数。

# sample data
df = pd.DataFrame({'c1':['a','b','c'], 'c2':['a b c d','e f g h','i j k l']})

# transform into multiple columns
df = pd.concat([df['c1'],df['c2'].str.split(' ', expand=True)], axis=1)

print(df)

  c1  0  1  2  3
0  a  a  b  c  d
1  b  e  f  g  h
2  c  i  j  k  l

【讨论】:

    【解决方案2】:

    使用@chrisz 设置

    df.set_index('col1')['col2'].str.extractall('(\w+)')[0].unstack()
    

    输出:

    match  0  1  2  3
    col1             
    a      a  b  c  d
    f      i  j  k  l
    s      e  f  g  h
    

    【讨论】:

      【解决方案3】:

      假设你的数据真的是这样的:

        col1     col2
      0    a  a b c d
      1    s  e f g h
      2    f  i j k l
      

      joinfindall

      df.join(pd.DataFrame(df.col2.str.findall(r'\w+').values.tolist())).drop('col2', 1)
      
        col1  0  1  2  3
      0    a  a  b  c  d
      1    s  e  f  g  h
      2    f  i  j  k  l
      

      【讨论】:

      • Niiii​​ice。谢谢你。这就是我一直在寻找的。​​span>
      • 乐于助人,快乐编程!
      • @Kalpit 查看已发布的其他一些答案,它们可能更有效,因此您可能想选择其中一个来使用,
      【解决方案4】:

      考虑一下这个df

      df = pd.DataFrame({'col1':[1,2], 'col2': ['10 20 30 40', '56 76 554 3243']})
      
          col1    col2
      0   1       10 20 30 40
      1   2       56 76 554 3243
      

      您可以使用 str.split 拆分 col2 上的整数。您可以手动分配结果列或使用范围,如下所示。正如您在评论中提到的那样,我使用了带有范围的示例,您总共查看了 99 列。

      cols = np.arange(df.col2.str.split(expand = True).shape[1])
      df[cols] = df.col2.str.split(expand = True)
      

      你得到

          col1    col2            0   1   2   3
      0   1       10 20 30 40     10  20  30  40
      1   2       56 76 554 3243  56  76  554 3243
      

      【讨论】:

        【解决方案5】:

        最紧凑

        df.drop('c2', 1).join(df.c2.str.split(expand=True))
        
          c1  0  1  2  3
        0  a  a  b  c  d
        1  b  e  f  g  h
        2  c  i  j  k  l
        

        忽略现有列 1

        pd.DataFrame([[a] + b.split() for a, b in df.values])
        
           0  1  2  3  4
        0  a  a  b  c  d
        1  b  e  f  g  h
        2  c  i  j  k  l
        

        忽略现有列 2

        pd.DataFrame([' '.join(r).split() for r in df.values])
        
           0  1  2  3  4
        0  a  a  b  c  d
        1  b  e  f  g  h
        2  c  i  j  k  l
        

        【讨论】:

          【解决方案6】:

          如果该数据集上的每一行都由换行符分隔,您可以执行以下操作:

          dataset = '''
          a    |    a b c d 
          s    |    e f g h
          f    |    i j k l
          '''
          for row in dataset.splitlines():
              print('{} {} {} | {} | {} | {}'.format(*row.split()))
          

          结果会如你所愿。

          a | a | b | c | d
          s | e | f | g | h
          f | i | j | k | l
          

          【讨论】:

            【解决方案7】:

            假设输入是字符串的形式,我们可以这样做

            import re
            s = "a    |    a b c d"
            s = re.sub("\s+[^a-z]"," ",s) # Replacing all non-alphabet characters with a single space
            s = re.sub(" ","|",s)
            

            这应该会给你想要的输出。由于pandas' replace 是在标准python re.sub 之上制作的,因此此信息应该适合您。

            【讨论】:

              猜你喜欢
              • 2014-02-05
              • 2018-07-27
              • 2011-12-30
              • 2021-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多