将数据框中的多个相关行转换为单个行以进行机器学习

时间:2017-08-21 11:03:02

标签: python python-3.x dataframe machine-learning

我是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

问题:

  1. 我是否正确地认为我需要将每个'样本'转换为一行

  2. 如果是这样,我如何遍历数据框来进行此转换。

  3. 请注意,对于“样本”,数据集将具有不同数量的要素,我仍然可以对此不规则形状进行分类。
  4. 另请注意,A1,A2或B1,B2的每个配对都是相关且相关的 谢谢

1 个答案:

答案 0 :(得分:0)

1。

是。由于大多数机器学习应用程序都希望输入形状(samples, features),因此您认为需要将每个样本转换为单行是正确的。

2

一种方法是添加一个新列,列出多个读数'对于每个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:A1L:B2L:C3L:D结合A1:1,{{1} }。这有点令人困惑,但我没有想到一个简单而通用的自动重命名列方式来完全匹配你的例子,特别是因为这在这里并不重要。

3

我不知道任何可以正确处理缺失值的简单分类器(A2:2等)。

您必须删除包含SVM值的所有行或所有列。删除列(要素)更常见,因为删除行(样本)意味着您以后无法使用分类器来预测任何具有NaN值的新样本的标签。

如果删除NaN列意味着您的案例中存在大量数据丢失并导致问题无法解决,则可能必须开始考虑更复杂的数据模型并使用例如适合它的NaN方法。

4

由于列名称仍然标识了“'” (Bayesian)以及原始列名称(0L, 1L, ...),以后会保留有关配对的信息。