我是python和ML的新手。我需要能够对以下数据(玩具示例)进行分类型机器学习(例如SVM或KNN):
dfRaw = pd.DataFrame([[1, 2, 3], [1, 4, 6], [1, 3, 6], [2, 38, 80], [2, 45, 66], [3, 100, 120],[3, 90, 110], [3, 115, 125], [3, 99, 101]], columns=['Sample', 'A1', 'A2'])
Sample A1 A2
0 1 2 3
1 1 4 6
2 1 3 6
3 2 38 80
4 2 45 66
5 3 100 120
6 3 90 110
7 3 115 125
8 3 99, 101
但我想我需要创建一个数据框,其中每个'Sample'都是这样的一行:
dfFin = pd.DataFrame([[1, 2, 3, 4, 6, 3, 6], [2, 38, 80, 45, 66], [3,100,120,90,110,115,125,99,101]], columns=['Sample', 'A1', 'A2','B1', 'B2', 'C1', 'C2', 'D1', 'D2' ]
print (dfFin)
Sample A1 A2 B1 B2 C1 C2 D1 D2
0 1 2 3 4 6 3.0 6.0 NaN NaN
1 2 38 80 45 66 NaN NaN NaN NaN
2 3 100 120 90 110 115.0 125.0 99.0 101.0
问题:
我是否正确地认为我需要将每个'样本'转换为一行
如果是这样,我如何遍历数据框来进行此转换。
答案 0 :(得分:0)
是。由于大多数机器学习应用程序都希望输入形状(samples, features)
,因此您认为需要将每个样本转换为单行是正确的。
一种方法是添加一个新列,列出多个读数'对于每个Sample
,然后使用pivot
将它们分成行。
# Add enumeration per sample using `comcount` on group
dfRaw['reading'] = dfRaw.groupby('Sample').cumcount()
# Pivot
dfFin = dfRaw.pivot(index='Sample', columns='reading')
# If desired: reduce multi-index header to single-index header
dfFin.columns = [''.join(str(col)).strip() for col in dfFin.columns.values]
dfFin.reset_index(inplace=True)
输出:
('A1', 0L) ('A1', 1L) ('A1', 2L) ('A1', 3L) ('A2', 0L) \
Sample
1 2.0 4.0 3.0 NaN 3.0
2 38.0 45.0 NaN NaN 80.0
3 100.0 90.0 115.0 99.0 120.0
('A2', 1L) ('A2', 2L) ('A2', 3L)
Sample
1 6.0 6.0 NaN
2 66.0 NaN NaN
3 110.0 125.0 101.0
在生成的列名称中,0L, 1L, ...
代表'读数'并且A1, A2
表示每个阅读的两个功能。因此,列标题会映射到您在示例输出中使用的0L:A
,1L:B
,2L:C
,3L:D
结合A1:1
,{{1} }。这有点令人困惑,但我没有想到一个简单而通用的自动重命名列方式来完全匹配你的例子,特别是因为这在这里并不重要。
我不知道任何可以正确处理缺失值的简单分类器(A2:2
等)。
您必须删除包含SVM
值的所有行或所有列。删除列(要素)更常见,因为删除行(样本)意味着您以后无法使用分类器来预测任何具有NaN
值的新样本的标签。
如果删除NaN
列意味着您的案例中存在大量数据丢失并导致问题无法解决,则可能必须开始考虑更复杂的数据模型并使用例如适合它的NaN
方法。
由于列名称仍然标识了“'” (Bayesian
)以及原始列名称(0L, 1L, ...
),以后会保留有关配对的信息。