我有一个类似的数据框:
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_ids
,group2
与field_ids
相同,(group1, group2)
每data
。
有没有办法有效地进行此转换?
我尝试了一些group2
和groupby
,但速度非常慢。
最终目标是将这些作为培训和结果,forloop
的第一列是输入,field_ids
列是输出。每行都是一个样本。
答案 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
值(如果不清楚,可以在方便时添加)