假设我们有一个数据框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
)是相等的,而有些则不是(组B
和C
)。我想检查这些组之间的相等性。换句话说,检查索引为A
和B
等的数据帧之间的相等性。
这是我的尝试。我们希望对数据进行分组
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
方法?
答案 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来处理不存在的组