2017-05-23 176 views
1

考虑下面的熊猫数据帧大熊猫基于

df = pd.DataFrame({0:['a',1,2,3,'a',1,2,3],1:[10,20,30,40,50,60,70,80],2:[100,200,300,400,500,600,700,800]}) 
    0 1 2 
0 a 10 100 
1 1 20 200 
2 2 30 300 
3 3 40 400 
4 a 50 500 
5 1 60 600 
6 2 70 700 
7 3 80 800 

我想重塑数据帧,使得我的期望输出应该像

1 2 3 4 
a 10 100 50 500 
1 20 200 60 600 
2 30 300 70 700 
3 40 400 80 800 

基本上,我有一列中重复的值重塑数据帧df [0]中重复且有限的一组值,但其他列中的相应值在每次重复时都是唯一的。我希望能够以这样的方式取消表格,以便我可以获得所需的输出。一个numpy解决方案也是可以接受的。

回答

0

您可以这样做:按第0列对行进行分组,然后将这些组转换为Series。

df.groupby(0)[1].apply(list).apply(pd.Series) 
# 0 1 
#0   
#1 20 60 
#2 30 70 
#3 40 80 
#a 10 50 
0

使用groupby然后值转换为列:

df.groupby(by=[0])[1].apply(lambda x: pd.Series(x.tolist())).unstack() 
Out[37]: 
    0 1 
0   
1 20 60 
2 30 70 
3 40 80 
a 10 50 
+0

当需要拆卸的列数不止一个时,此解决方案不起作用。我的不好,但不像演示数据,真实的数据有多个相应的列。 –

+0

嗯,你可以更新你的示例数据,然后@SirajS。? – Allen

+0

更新了问题以反映问题。谢谢。 –

0

这里有一个解决方案,使用字典来存储您的重复值和相应的列,并且将其转换回一个数据帧。请记住,词典是无序的,所以如果你想保持重复值的顺序,你需要稍微调整一下。

df = pd.DataFrame({0:['a',1,2,3,'a',1,2,3],1:[10,20,30,40,50,60,70,80]}) 
unstacked = {} 
for index, row in df.iterrows(): 
    if row.iloc[0] not in unstacked: 
     unstacked[ row.iloc[0] ] = list(row[1::]) 
    else: 
     unstacked[ row.iloc[0] ] += list(row[1::]) 


unstacked_df = pd.DataFrame.from_dict(unstacked, orient='index') 
print unstacked_df 

    0 1 
a 10 50 
1 20 60 
2 30 70 
3 40 80