我的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>)
对于如何修复实际数据集或正确创建具有两个列表(点和标签)的任何帮助表示赞赏。
答案 0 :(得分:3)
这是我怎么做的。首先删除你的1列(所以我们不要弄乱命名):
df['id'] = df[1]
df = df.drop(1, axis = 1)
然后用我们想要连接的东西创建一个objs,并且concat:
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
答案 1 :(得分: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
然后,您只需要连接最后一列并重命名所有列。
答案 2 :(得分:0)
您可以以不同方式创建数据框以获得所需内容,而不是尝试分解列。见下面的代码,
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
答案 3 :(得分:-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]