2015-12-11 421 views
3

说我有以下数据框:大熊猫组数据帧

>>> Data=pd.DataFrame() 
>>> Data['Color']=['Green','Green','Green','Blue','Blue','Green','Green','Blue','Green','Yellow'] 
>>> Data['Count']=np.random.randint(0,100,10) 
>>> Data 
    Color Count 
0 Green  75 
1 Green  53 
2 Green  89 
3 Blue  66 
4 Blue  45 
5 Green  98 
6 Green  7 
7 Blue  28 
8 Green  28 
9 Yellow  7 

我如何通过双方通过邻接形成在同一价值的其他记录的列“颜色”和团体组柱。例如,我希望的输出将如下所示(请注意,'Count'列上应用的函数是任意的,但在这种情况下,我使用了sum)。

   Value 
Group Color   
0  Blue  111 
     Green  217 
     Yellow  7 
1  Blue  28 
     Green  105 
2  Green  28 

前3条记录都对颜色相同的值,因此可用于组0的绿色。接下来的2条记录对于颜色具有相同的值,因此在蓝色组中为0。然后还有2个绿色的记录会将它们放入绿色的组1中。等等。

+0

这个问题不太清楚。你是什​​么意思“组合”?两者是什么?只有一个DataFrame。第二个代码块是你想要的输出? – iled

+0

我刚刚编辑并试图澄清所需的输出。 'Both'指的不仅是列'Color'上的分组,而且还要求颜色值位于由相同颜色值的其他记录邻接形成的组中。我认为上面编辑的答案应该更清楚。 – AJG519

回答

2

这是一个有点棘手。 IIUC,你可以得到你想要这样的结果:

>>> df = pd.DataFrame({'Colour': {0: 'Green', 1: 'Green', 2: 'Green', 3: 'Blue', 4: 'Blue', 5: 'Green', 6: 'Green', 7: 'Blue', 8: 'Green', 9: 'Yellow'}, 'Count': {0: 75, 1: 53, 2: 89, 3: 66, 4: 45, 5: 98, 6: 7, 7: 28, 8: 28, 9: 7}}) 
>>> cid = (df["Colour"] != df["Colour"].shift()).cumsum() 
>>> df["Group"] = cid.groupby(df["Colour"]).rank("dense") - 1 
>>> df.groupby(["Group", "Colour"]).sum() 
       Count 
Group Colour  
0  Blue  111 
     Green  217 
     Yellow  7 
1  Blue  28 
     Green  105 
2  Green  28 

这工作,因为cid是通过切换 - 比较 - cumsum模式建立了一个“连续的簇”的ID。在我们有cid之后,我们可以按照颜色对这些簇ID进行分组,并对它们进行密集排序以获得组ID。