我想计算一个pandas数据帧中groupby之后的匹配数。
claim event material1 material2
A X M1 M2
A X M2 M3
A X M3 M0
A X M4 M4
A Y M5 M5
A Y M6 M0
B Z M7 M0
B Z M8 M0
首先,我按照对索赔事件进行分组,对于每个组,我想计算列material1和material 2之间的匹配数
对于小组来说,我有grouped = df.groupby(['claim', 'event'])
,但后来我不知道如何比较这两个新列。
它应该返回以下数据帧:
claim event matches
A X 3
A Y 1
B Z 0
你知道怎么做吗?
答案 0 :(得分:3)
使用isin
用于比较列,按比例分组使用汇总sum
,最后投放到int
和reset_index
用于MultiIndex
的列:
a = (df['material1'].isin(df['material2']))
df = a.groupby([df['claim'], df['event']]).sum().astype(int).reset_index(name='matches')
分配给新列的解决方案:
df['matches'] = df['material1'].isin(df['material2']).astype(int)
df = df.groupby(['claim', 'event'])['matches'].sum().reset_index()
@Wen的解决方案,谢谢你:
df['matches'] = df['material1'].isin(df['material2']).astype(int)
df = df.groupby(['claim', 'event'], as_index=False)['matches'].sum()
我认为较大的DataFrame
s:
df = (df.groupby(['claim', 'event'])
.apply(lambda x : x['material1'].isin(x['material2']).astype(int).sum())
.reset_index(name='matches'))
print (df)
claim event matches
0 A X 3
1 A Y 1
2 B Z 0