说我有以下数据框:
>>> 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 :(得分: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。