2016-11-10 58 views
2

我有以下数据集的Python:变换数据集

  id type value 
0    1 A 10 
1    1 C 120 
2    2 B 20 
3    2 C 40 
4    3 A 10 
5    3 B 50 

我想在python改造它要像(1,A,10,C,120) (2,B,20,C,40) (3,A,10,B,50)

任何建议将不胜感激

+3

开始从[这里](https://docs.python.org/3/tutorial/),请阅读[这](https://开头的文档.python.org/3/library/ itertools.html)和[this](https://docs.python.org/3/tutorial/datastructures.html)。最后使用[this](https://docs.python.org/3/library/csv.html)并解决你的问题。至于这个问题,Stack Overflow太广泛了。见[问]和[mcve]。 –

+0

另外,观看[this](http://pandas.pydata.org/talks.html#pycon-us-2015)视频并观看[this](http://pandas.pydata.org/pandas-docs/版本/ 0.18.1/api.html#id5)在熊猫文档 – wwii

回答

2

执行groupby WRT 编号为的列。通过将其他两列转换为list,并将每个组编号旁边的对应于id的唯一值进行迭代,从而遍历每个组。最后,将它们转换为tuple并将它们附加到列表中。

grouped = df.groupby('id') 
L = [] 
for _, grp in grouped: 
    L.append(tuple(grouped.get_group(_)['id'].unique().tolist() + grp[['type','value']].values.ravel().tolist())) 
print(L) 
#[(1, 'A', 10, 'C', 120), (2, 'B', 20, 'C', 40), (3, 'A', 10, 'B', 50)] 
+1

谢谢@Nickil Maveli,但是当我运行你的实现后价值另一个'L'被追加,有反正我可以摆脱它吗? –

+0

你的意思是你不想把它们作为一个列表?你想如何存储它们?您也可以尝试编辑问题以显示发生了什么问题。 –

2

您可以使用:

L = df.groupby('id').apply(lambda x: tuple([x['id'].iat[0]] + 
              x[['type','value']].values.flatten().tolist())) 
        .tolist() 
print (L) 
[(1, 'A', 10, 'C', 120), (2, 'B', 20, 'C', 40), (3, 'A', 10, 'B', 50)]