pandas DataFrame分解列内容



我有一个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>)

对于如何修复实际数据集或正确创建具有两个列表(点和标签)的数据集,我们将不胜感激。

以下是我的操作方法。首先删除你的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

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

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 

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

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

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

我能提供的最好的:

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]

最新更新