【问题标题】:How to split one cell of csv into columns of dataframe based on separator如何根据分隔符将一个csv单元格拆分为数据框列
【发布时间】:2019-12-01 13:02:31
【问题描述】:

我有一个 csv 文件,所有数据都显示在列中,我想将该列中的数值数据拆分为几列。 我拥有的数据(读取数据框后)如下所示:

      0
0     13:25:09 -> mm [ -5,  4,  15 ] dd [ 4, 77, 8 ]
1     13:25:09 -> mm [ -4,  9,  10 ] dd [ 8, 6, 10 ]
2     13:25:09 -> mm [ 0,  -4,  19 ] dd [ 3, 1, 66 ]

我该怎么做?

【问题讨论】:

    标签: python pandas csv dataframe


    【解决方案1】:

    我相信你需要Series.str.extractallSeries.unstack

    df = df[0].str.extractall('(\d+)')[0].unstack()
    print (df)
    match   0   1   2  3  4   5  6   7   8
    0      13  25  09  5  4  15  4  77   8
    1      13  25  09  4  9  10  8   6  10
    2      13  25  09  0  4  19  3   1  66
    

    【讨论】:

      【解决方案2】:

      拥有这个 csv 文件

      csvfile = '''13:25:09 -> mm [ -5,  4,  15 ] dd [ 4, 77, 8 ]
      13:25:09 -> mm [ -4,  9,  10 ] dd [ 8, 6, 10 ]
      13:25:09 -> mm [ 0,  -4,  19 ] dd [ 3, 1, 66 ]'''
      

      错误的结果

      通过做

      import pandas as pd
      
      lines = csvfile.split('\n')
      df = pd.DataFrame(lines)
      

      你得到一个错误的结果:

                                                      0
      0  13:25:09 -> mm [ -5,  4,  15 ] dd [ 4, 77, 8 ]
      1  13:25:09 -> mm [ -4,  9,  10 ] dd [ 8, 6, 10 ]
      2  13:25:09 -> mm [ 0,  -4,  19 ] dd [ 3, 1, 66 ]
      

      更好的结果

      你应该这样做:

      import pandas as pd
      
      lines = csvfile.split('\n')
      
      df = pd.DataFrame({'id': [1,2,3], 
                         'time': [line[:8] for line in lines], 
                         'mm': [line[15:30] for line in lines],
                         'dd': [line[34:50] for line in lines]})
      

      你得到

         id      time               mm            dd
      0   1  13:25:09  [ -5,  4,  15 ]  [ 4, 77, 8 ]
      1   2  13:25:09  [ -4,  9,  10 ]  [ 8, 6, 10 ]
      2   3  13:25:09  [ 0,  -4,  19 ]  [ 3, 1, 66 ]
      

      如果我不想要字符串而是整数怎么办

      注意 mm 将是一个字符串

      print(type(df['mm'][0]))
      <class 'str'>
      

      如果有一个整数列表会很好

      df['mm_list'] = df['mm'].str.replace('[', '').str.replace(']', '').str.split(',').values.tolist()
      df['mm_list_int'] = [[int(i) for i in x] for x in df['mm_list']]
      df
      

      导致新列mm_list_int

         id      time               mm            dd            mm_list  mm_list_int
      0   1  13:25:09  [ -5,  4,  15 ]  [ 4, 77, 8 ]  [ -5,   4,   15 ]  [-5, 4, 15]
      1   2  13:25:09  [ -4,  9,  10 ]  [ 8, 6, 10 ]  [ -4,   9,   10 ]  [-4, 9, 10]
      2   3  13:25:09  [ 0,  -4,  19 ]  [ 3, 1, 66 ]  [ 0,   -4,   19 ]  [0, -4, 19]
      

      类型正确

      print(type(df['mm_list_int'][0]))
      <class 'list'>
      
      print(type(df['mm_list_int'][0][0]))
      <class 'int'>
      

      这是一个整数列表

      如果我希望三个 mm 值在不同的列中怎么办?

      使用

      objs = [df, pd.DataFrame(df['mm_list_int'].tolist(), columns=['mm_x', 'mm_y', 'mm_z'])]
      df_final = pd.concat(objs, axis=1)
      df_final = df_final[['id', 'time', 'mm', 'dd', 'mm_x', 'mm_y', 'mm_z']]
      

      获得

         id      time               mm            dd  mm_x  mm_y  mm_z
      0   1  13:25:09  [ -5,  4,  15 ]  [ 4, 77, 8 ]    -5     4    15
      1   2  13:25:09  [ -4,  9,  10 ]  [ 8, 6, 10 ]    -4     9    10
      2   3  13:25:09  [ 0,  -4,  19 ]  [ 3, 1, 66 ]     0    -4    19
      

      最后的润色

      dd 做同样的事情,你就完成了

      df['dd_list'] = df['dd'].str.replace('[', '').str.replace(']', '').str.split(',').values.tolist()
      df['dd_list_int'] = [[int(i) for i in x] for x in df['dd_list']]
      
      objs = [df, 
              pd.DataFrame(df['mm_list_int'].tolist(), columns=['mm_x', 'mm_y', 'mm_z']),
              pd.DataFrame(df['dd_list_int'].tolist(), columns=['dd_x', 'dd_y', 'dd_z'])]
      df_final = pd.concat(objs, axis=1)
      df_final = df_final[['id', 'time', 'mm_x', 'mm_y', 'mm_z', 'dd_x', 'dd_y', 'dd_z']]
      

      最终结果

         id      time  mm_x  mm_y  mm_z  dd_x  dd_y  dd_z
      0   1  13:25:09    -5     4    15     4    77     8
      1   2  13:25:09    -4     9    10     8     6    10
      2   3  13:25:09     0    -4    19     3     1    66
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-24
        • 2020-06-08
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多