【发布时间】:2017-06-06 07:26:58
【问题描述】:
我有一张如下所示的表格:
company_id,company_name
1,Amazon
1,Amazon Ltd
2,Google
1,Amazon
2,Gogle
3,Facebook Ltd
3,Facebook LTD
1,AMAZON
1,AMAZON LTD
2,GOOGLE
3,Facebook
3,Face book
所以我对每家公司都有一个唯一的标识符,但它们的文本表示不同。我努力的是消除这些不一致的地方,并有一些类似的东西:
company_id,company_name
1,Amazon
1,Amazon
2,Google
1,Amazon
2,Google
3,Facebook
3,Facebook
1,Amazon
1,Amazon
2,Google
3,Facebook
3,Facebook
我对选择标准没有死心——它可以是所述组中最常见的值,也可以是随机值。但我需要的是高效的,因为我的表已经增长到包含数百万行。
我的解决方案是创建 id -> name 的独特组合的哈希映射,然后根据这些组合进行替换。大致如下:
dd = df.drop_duplicates().set_index('company_id').to_dict()['company_name']
df.company_name = df.company_id
df.company_name = df.company_name.replace(dd)
这在较小的集合上工作得很好,但由于它创建的哈希映射很大,它变得相当慢并且内存效率低。
我还尝试了基于company_id 的groupby 并将每个组中的所有company_names 替换为随机值,但我无法修改底层数据帧(没有.locing它,这是双重低效的)。
想到的最后一个选项是创建一个具有唯一值 (df.drop_duplicates('company_id')) 的单独框架,并将其与基于 company_id 的原始框架合并,但这听起来也不是很有效。
【问题讨论】:
-
您的解决方案对我来说似乎很好。
df.company_name = df.company_name.replace(dd)在这里而不是replace如果你使用map它会快很多。但是,无论如何您都需要这些对,所以我不知道您将如何解决内存问题。你确定这是个问题?你有多少个唯一标识符? -
您不需要
.loc将它们重新分配回底层DF。Groupby.transform会处理的。
标签: python pandas data-cleaning