来自熊猫的 groupby 是可交换的吗?

cri*_*tig 5 python commutativity pandas

我想知道是否通过以下方式选择了行:

groupby(['a', 'b']) 
Run Code Online (Sandbox Code Playgroud)

与通过以下方式选择的行相同:

groupby(['b', 'a'])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,行的顺序无关紧要。

groupby没有不满足交换性的情况?

Iva*_*sky 8

根据定义和使用groupbyin时应用的逻辑pandas,它将始终是可交换的:

groupby 操作涉及拆分对象、应用函数和组合结果的某种组合。

这种组合是线性的,因此是可交换的。重要的是,当传递多个by值时,在处理它们时应该牢记新索引值中的顺序。

从维基百科的线性组合交换属性

在数学中,线性组合是由一组项通过将每个项乘以一个常数并将结果相加而构建的表达式。多年来一直隐含地假设简单运算(例如数字的乘法和加法)是可交换的。


jez*_*ael 4

我认为计数顺序并不重要,只有在 groupby 按顺序获取第一列/级别之后,就像列表中的列一样。

df = pd.DataFrame({
        'a':list('aaaaaa'),
         'b':[4,5,4,5,5,4],
         'c':[7,8,9,4,2,3],

})
Run Code Online (Sandbox Code Playgroud)

聚合后的级别顺序groupby

df1 = df.groupby(['a', 'b']).sum()
print (df1)
      c
a b    
a 4  19
  5  14

df2 = df.groupby(['b', 'a']).sum()
print (df2)
      c
b a    
4 a  19
5 a  14
Run Code Online (Sandbox Code Playgroud)

和专栏:

df3 = df.groupby(['a', 'b'], as_index=False).sum()
print (df3)
   a  b   c
0  a  4  19
1  a  5  14

df4 = df.groupby(['b', 'a'], as_index=False).sum()
print (df4)
   b  a   c
0  4  a  19
1  5  a  14
Run Code Online (Sandbox Code Playgroud)

如果对与原始结果相同大小的新列使用转换,则结果相同:

df['new1'] = df.groupby(['a', 'b'])['c'].transform('sum')
df['new2'] = df.groupby(['b', 'a'])['c'].transform('sum')
print (df)
   a  b  c  new1  new2
0  a  4  7    19    19
1  a  5  8    14    14
2  a  4  9    19    19
3  a  5  4    14    14
4  a  5  2    14    14
5  a  4  3    19    19
Run Code Online (Sandbox Code Playgroud)