如何将 Pandas GroupBy 的发现应用于源数据

How do I apply the findings of a Pandas GroupBy to the source data

我正在使用 pandas de_dupe 进行名称去重,并且有多个步骤。

首先我对源数据进行训练和去重。

deDupedNames = dedupe_dataframe( sourceData, columnsOfInterest, config_name=configName)

接下来我丢弃集群只有 1 个参与者的数据集

dedupedComplexSets = dedupe_df_sorted.groupby( ['cluster id']).filter(lambda x: len(x) > 1)

接下来我需要检查每组匹配项(按 'cluster id' 分组)并确认至少每组名称的前 3 个字符相同。 我这样做是通过遍历 dedupedComplexSets 中的每个组,并根据每个 Surname.

的前三个字符进一步对每个组的内容进行分组
for name, group in dedupedComplexSetsGrouped:
    bySurnamePrefix = group.groupby(group.Surname.str[:3]).size()

最后,我想标记属于已去重集群的每一行,其中姓氏 'begins withs' 的数量 > 1

for name, group in dedupedComplexSetsGrouped:
    bySurnamePrefix = group.groupby(group.Surname.str[:3]).size()

    if( len( bySurnamePrefix) > 1):
        dedupedComplexSets[group, 'RowClusterHasLeadingCharacterMismatch'] = True

但是,由于 'mutable hash' 错误或其他错误,我无法写回原始数据帧。

这样的问题是怎么解决的?以及如何在 Grouped Set 数据框之外传达组检查的输出?一定有正确的方法...?

示例数据(其中 RowClusterHasLeadingCharacterMismatch 是脚本列):

行号|名字|姓氏

12345, fred, surname, false, 
24385, frred, surname, false, 

示例数据输出: RowID|FirstName|Surname|cluster id|confidence|RowClusterHasLeadingCharacterMismatch

12345, fred, surname, false, 1, .9999995, True
24385, frred, surname, false, 1, .999992, True

请注意,我使用 RowClusterHasLeadingCharacterMismatch 作为记录不匹配的方式。也许有更有效的方法来做到这一点?

以上评论中 Jezrael 的回答:

替换: dedupedComplexSets[group, 'RowClusterHasLeadingCharacterMismatch'] = True to

dedupedComplexSets.loc[group.index, 'RowClusterHasLeadingCharacterMismatch'] = True

我的评论:对 dedupedComplexSets 所做的更改将反映在 dedupedComplexSets 中,并且可以保存到 CSV。