我有一个spark数据框,位置列包含国家名称。我需要将这些名称转换为ISO 3代码。我知道有一个python库的国家转换器,但我不知道如何应用它,所以它只转换我的数据框中一列的值。
Dataframe 示例:
| 用户名|地点|
| --------------|--------------|
| 亚当|美国|
| 阿纳斯塔西亚|联合 Realm |
我可以将国家名称从列转换为代码,方法是将它们转换为RDD,然后再次转换为DF:
import country_converter as coco
out_format = "ISO3"
countries = df.select("Location").rdd.collect()
countries = coco.convert(names=countries, to=out_format, not_found=None)
countriesDF = spark.createDataFrame(countries, StringType())
输出:
| 价值|
| --------------|
| 美国|
| GBR|
但是,这段代码有两个问题:
1.因此,我创建了完全不同的dataframe,并丢失了有关UserName的信息。我需要输出如下所示:
预期产出:
| 用户名|地点|
| --------------|--------------|
| 亚当|美国|
| 阿纳斯塔西亚|GBR|
1.一些结果是这样的:Row(Countries ='London,UK'),我如何才能摆脱这个?我使用下面的代码,但我想知道是否有更快的方法比手动为每一行:
countriesDF.replace({"Row(Countries='London, UK')" : "GBR"})
3条答案
按热度按时间6rqinv9w1#
更新:
如果数据量很大,可以使用字典来Map所有的值。
命令耗时8.85秒。20万条记录在8.5秒内完成
您应该使用
UDF
来执行此操作。输出:
rjjhvcjd2#
对于大数据,我发现它似乎有效:
oxiaedzo3#
请注意,
country_converter
仅支持英语国家名称。如果您需要支持多种语言的解决方案,请考虑探索countrywrangler
,它提供34种语言的支持,并为提高速度效率而开发。下面是一个简单的例子:
CountryWrangler包括一个模糊搜索,能够检测几乎所有国家,无论格式风格或拼写错误的变化。它比正常功能慢100倍,但与其他库相比仍然很快。
完整的文档可以在这里找到:https://countrywrangler.readthedocs.io/en/latest/normalize/country_name/
披露:作为CountryWrangler的作者,我想澄清一下,这个答案并不是为了阻止使用country_converter,而是为了为某些用例提供一种替代解决方案。