如何将 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。
我正在使用 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。