我正在研究数据预处理,我想以与n-gram相似的方式在数据框架中安排样本。例如,如果我的样本为:
1,2,3,4 1
0,4,2,1 1
0,2,3,5 1
1,5,5,5 0
6,5,2,1 0
我希望新的数据框看起来像这样:
1,2,3,4,0,4,2,1,0,2,3,5 1
0,4,2,1,0,2,3,5,1,5,5,5 0
0,2,3,5,1,5,5,5,6,5,2,1 0
目标变量基本上是最后一个附加样本的目标值(即第三个)。
我正在使用Scikit-Learn在Python 3中使用Pandas DataFrame进行机器学习。
如何迭代数据帧样本并并排连接它们?我尝试了 concat
,但是每行变成类型 Series
,因此不连接。
以获取进一步的参考,我早些时候在这里提出了一个问题。
任何建议都将不胜感激。
本质上,您正在尝试连续移动数据框架的版本。您可以做到这一点是列表理解:
window_size=3
pd.concat([df.iloc[:,0:4].shift(-i) for i in range(window_size)]
+ [df.iloc[:,4].shift(1 - window_size)], axis=1).iloc[0:1 - window_size]
a b c d a b c d a b c d y
0 1 2 3 4 0.0 4.0 2.0 1.0 0.0 2.0 3.0 5.0 1.0
1 0 4 2 1 0.0 2.0 3.0 5.0 1.0 5.0 5.0 5.0 0.0
2 0 2 3 5 1.0 5.0 5.0 5.0 6.0 5.0 2.0 1.0 0.0
这更多是一个numpy问题
用于生成数据的代码
data =np.array([[1,2,3,4],
[0,4,2,1 ],
[0,2,3,5 ],
[1,5,5,5 ],
[6,5,2,1 ]])
labels = np.array([[1,1,1,0,0]]).transpose()
'重塑'数据
row_ids = [range(k,k+3) for k in range(x.shape[0]-2)]
new_data = np.reshape(data[row_ids, :], [data.shape[0]-2, 12])
new_labels = labels[2:]
结果:
print new_data
print new_labels
[[1 2 3 4 0 4 2 1 0 2 3 5]
[0 4 2 1 0 2 3 5 1 5 5 5]
[0 2 3 5 1 5 5 5 6 5 2 1]]
[[1]
[0]
[0]]
最后,制作熊猫DF:
df = pd.DataFrame(new_data)
df['new_labels'] = new_labels
作为旁注:要获得更好的理解,请参阅我们如何用row_ids
对数据进行采样print row_ids
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]