Pandas按列和索引邻接对数据帧进行分组

时间:2015-12-11 18:52:46

标签: python pandas

说我有以下数据框:

>>> 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组中为绿色。等等等。

1 个答案:

答案 0 :(得分: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是使用shift-compare-cumsum模式构建的“连续集群”id。在我们有cid之后,我们可以按颜色对这些群集ID进行分组,并对它们进行密集排序以获得群组ID。