如何将DB行转换为训练矩阵

时间:2017-09-20 20:31:34

标签: python pandas numpy dataframe

我有一个类似的数据框:

index  group1 group2 field_id  value  data
  0      1     1        1        1     12
  1      1     1        1        2     12
  2      1     1        2        1     12
  3      1     1        3        2     12
  4      1     2        1        1     12
  5      1     2        3        1     12
  6      1     2        4        1    ...
  7      1     2        2        2
  8      1     2        1        1
  9      1     3        1        1
  10     2
  11     ...

我想将其转换为numpy矩阵:

index group2 field_id_1 field_id2 field_3 field_id_4 data
  0      1        1,2        1        2       0       12

所以我想将每个value的{​​{1}}收集到列中。 每行field_idsgroup2field_ids相同,(group1, group2)data

有没有办法有效地进行此转换? 我尝试了一些group2groupby,但速度非常慢。

最终目标是将这些作为培训和结果,forloop的第一列是输入,field_ids列是输出。每行都是一个样本。

1 个答案:

答案 0 :(得分:0)

让我们从groupby开始合并同一字段的值:

In [22]: df
Out[22]: 
   index  group1  group2  field_id  value  data
0      0       1       1         1      1    12
1      1       1       1         1      2    12
2      2       1       1         2      1    12
3      3       1       1         3      2    12
4      4       1       2         1      1    12
5      5       1       2         3      1    12

In [54]: grouped = df.groupby(['group1', 'group2', 'field_id']).agg({'value': lambda x: ', '.join(map(str, x)), 'data': np.min}).reset_index()

In [55]: grouped
Out[55]: 
   group1  group2  field_id  data value
0       1       1         1    12  1, 2
1       1       1         2    12     1
2       1       1         3    12     2
3       1       2         1    12     1
4       1       2         3    12     1

我们现在可以使用pivot_table将ID转换为列:

In [56]: grouped.pivot_table(values='value', index=['group2', 'data'], columns='field_id', aggfunc='first').reset_index()
Out[56]: 
field_id  group2  data     1     2  3
0              1    12  1, 2     1  2
1              2    12     1  None  1

这些数字指的是field_id值(如果不清楚,可以在方便时添加)