【问题标题】:pandas DataFrame explode column contents [duplicate]pandas DataFrame 爆炸列内容[重复]
【发布时间】:2016-08-02 05:17:53
【问题描述】:

我有一个pandas.core.frame.DataFrame,看起来像这样:

         0 1
0  [1,2,3] 1
1  [2,2,1] 1
2  [1,2,1] 1
...

最后一列是标签,列“0”下的每个数组都应该是给定类的不同数据点。

我想把它变成:

   x0 x1 x2 label
0  1  2  3  1
1  2  2  1  1
2  1  2  1  1

我尝试了以下没有运气

ds = ds.apply(lambda x: numpy.ravel(x))

这是下面的结果,显然这不是正确的方法。

<list>.extend(zip(points,labels))
ds = pandas.core.frame.DataFrame(data=<list>)

对于如何修复实际数据集或使用两个列表(点和标签)正确创建数据集的任何帮助表示赞赏。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我假设您当前的列标题是文本而不是整数。

    df2 = pd.concat([pd.DataFrame(zip(*df['0'])), df['1']], axis=1)
    df2.columns = ['x' + str(c) for c in df2.columns[:-1]] + ['label']
    
    >>> df2
       x0  x1  x2  label
    0   1   2   1      1
    1   2   2   2      1
    2   3   1   1      1
    

    zip* 运算符一起使用会解压缩列表:

    >>> zip(*df['0'])
    [(1, 2, 1), (2, 2, 2), (3, 1, 1)]
    

    因此您可以轻松扩展数据框:

    >>> pd.DataFrame(zip(*df['0']))
       0  1  2
    0  1  2  1
    1  2  2  2
    2  3  1  1 
    

    然后您只需连接最后一列并重命名所有列。

    【讨论】:

    • 列是整数。当我尝试 pd.DataFrame(zip(*ds[0])) 时,出现以下错误: frame.py 283 mgr = self._init_dict({}, index, columns, dtype=dtype) 284 elif isinstance(data, collections .Iterator): --> 285 raise TypeError("data argument can't be an iterator") 286 else: 287 try: TypeError: data argument can't be an iterator.有什么想法吗?
    【解决方案2】:

    我能提供的最好的:

    import numpy as np
    # first convert your lists to an array, then iterate
    tmp = np.array( df[0].tolist() )
    
    for r in np.arange(0,3):
        df['x' + str(r)] = tmp[:,r]
    

    【讨论】:

      【解决方案3】:

      我会这样做。首先删除您的 1 列(这样我们就不会弄乱命名):

      df['id'] = df[1]
      df = df.drop(1, axis = 1)
      

      然后创建一个objs,用我们想要连接的东西,然后连接:

      objs = [df, pd.DataFrame(df[0].tolist())]
      pd.concat(objs, axis=1)
      
      
      
                 0    id  0   1   2
      0   [1, 2, 3]   1   1   2   3
      1   [2, 2, 1]   1   2   2   1
      2   [1, 2, 1]   1   1   2   1
      

      【讨论】:

      • 这个解决方案效果最好!我将第二部分稍微修改为:pd.concat([df, pd.DataFrame(list(df[0]))], axis=1),似乎比使用.tolist() 时表现稍好。谢谢你!
      【解决方案4】:

      您可以以不同的方式创建数据框以获得所需的内容,而不是尝试分解列。请参阅下面的代码,

      import pandas as pd
      points = [[1,2,3],[2,2,1],[1,2,1]]
      labels = [1,1,1]
      x0 = [p[0] for p in points]
      x1 = [p[1] for p in points]
      x2 = [p[2] for p in points]
      df = pd.DataFrame({'x0': x0,'x1': x1,'x2': x2, 'label': labels})
      print (df)
      

      得到,

         label  x0  x1  x2
      0      1   1   2   3
      1      1   2   2   1
      2      1   1   2   1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 2014-07-12
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 2022-01-24
        相关资源
        最近更新 更多