比较groupby对象的相等性

时间:2018-06-15 14:23:32

标签: python-3.x pandas dataframe pandas-groupby

假设我们有一个数据框df1和数据框两个df2

import pandas as pd

dict1= {'group':['A','A','B','C','C','C'],'col2':[1,7,4,2,1,0],'col3':[1,1,3,4,5,3]}
df1 = pd.DataFrame(data=dict1).set_index('group')

dict2 = {'group':['A','A','B','C','C','C'],'col2':[1,7,400,2,1,0],'col3':[1,1,3,4,5,3500]}
df2 = pd.DataFrame(data=dict2).set_index('group')

df1
       col2  col3
group            
A         1     1
A         7     1
B         4     3
C         2     4
C         1     5
C         0     3


df2
       col2  col3
group            
A         1     1
A         7     1
B       400     3
C         2     4
C         1     5
C         0  3500

在pandas中,很容易将这两个数据帧的相等性与df1.equals(df2)进行比较。在这种情况下False

但是,我们可以看到这些组中的某些(给定玩具示例中的A)是相等的,而有些则不是(组BC)。我想检查这些组之间的相等性。换句话说,检查索引为AB等的数据帧之间的相等性。

这是我的尝试。我们希望对数据进行分组

 g1 = df1.groupby('group')
 g2 = df2.groupby('group')

天真地尝试g1.equals(g2)会出现错误Cannot access callable attribute 'equals' of 'DataFrameGroupBy' objects, try using the 'apply' method

但是,如果我们尝试

 g1.apply(lambda x: x.equals(g2))

我们得到一个系列

group
A    False
B    False
C    False
dtype: bool

但是,第一个条目应为True,因为第一个案例组A在两个数据帧之间相等。

我可以看到我可以费力地构建嵌套循环来做到这一点,但这很慢。我觉得有一种方法可以在pandas中使用循环来实现这一点吗?我想我在滥用apply方法?

1 个答案:

答案 0 :(得分:3)

您可以在get_group上致电g2来检索要比较的群组,您可以使用属性.name访问群组名称:

In[316]:
g1.apply(lambda x: x.equals(g2.get_group(x.name)))

Out[316]: 
group
A     True
B    False
C    False
dtype: bool

修改

处理不存在的群组:

In[320]:
g1.apply(lambda x: x.equals(g2.get_group(x.name)) if x.name in g2.groups else False)

Out[320]: 
group
A     True
B    False
C    False
dtype: bool

示例:

In[323]:
dict1= {'group':['A','A','B','C','C','C','D'],'col2':[1,7,4,2,1,0,-1],'col3':[1,1,3,4,
                                                               5,3,-1]}
df1 = pd.DataFrame(data=dict1).set_index('group')
g1 = df1.groupby('group')

g1.apply(lambda x: x.equals(g2.get_group(x.name)) if x.name in g2.groups else False)

Out[323]: 
group
A     True
B    False
C    False
D    False
dtype: bool

这里.groups返回组的dict,键是组名/标签,我们可以使用x.name in g2.groups测试存在并修改lambda来处理不存在的组