Pandas按列和索引相邻性对数据框进行分组

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

前三条记录的颜色相同,因此在绿色的组0中。接下来两条记录的颜色相同,因此在蓝色的组0中。然后有两个更多的绿色记录,将它们放入绿色的组1中。等等,等等。


这个问题不太清楚。你所说的“group both”是什么意思?两者都是什么?只有一个DataFrame。第二个代码块是你想要的输出吗? - iled
我刚刚编辑并尝试澄清所需输出。'Both' 指的是分组不仅基于 'Color' 列,还要求颜色值处于由相邻记录形成的同一颜色值组中。我认为上面编辑后的回答应该更清晰明了。 - AJG519
1个回答

2
这个有点棘手。如果我理解得正确,你可以像这样获得想要的结果:
>>> 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是使用移位-比较-累加模式构建的“连续簇”标识符。有了cid后,我们可以按颜色分组这些簇标识符,并进行密集排名以获得组标识符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接