使用Python的pandas库从geonames导入文本文件

4

我从geonames下载了一个国家数据集,然后使用以下命令将数据集解析成列:

data = pd.read_csv("C:/Users/Documents/TR.txt", sep="\t", header = None)

但由于某些原因,这个程序不能正确解析所有行。大多数行都被正确解析,但有大约2K的行没有被解析。我使用了以下代码来查看哪些行没有被正确解析:

data.to_csv("C:/Users/Documents/output.csv")

然后,我在 Excel 中打开了 output.csv 文件,并发现有些行没有被解析。但是,当我在 Excel 中打开原始的 TR.txt 数据集并使用 TAB 分隔符时,所有行都正确显示为已解析。所以,我在我的 Python 代码中做错了什么,但我无法弄清楚。是我输出数据集的方式有问题吗?谢谢。


在Excel中以制表符分隔的方式打开TR.txt文件,至少有7行无法正确解析,第一行是第15191行,第一列的值为311071 - 你也遇到了这个问题吗? - Stefan
你的 RAM 大小是多少? - jezrael
1个回答

6

一定要阅读readme.txt文件。

在这种情况下,有两个值得注意的问题正在发生。

  1. 期望高度(第15列)为int类型,但包含空格。如果将数据类型指定为int,则会生成错误,因为int没有NaN值。解决方法是将其转换为float。如果您确实想要一个int,则为缺失字段创建一个sentinal值(例如-99999),使用fillna()填充此值,然后将其转换为int。

  2. 某些列包含逗号分隔的列表(例如第3列,备用名称)。当您使用data.to_csv("C:/Users/Documents/output.csv")时,会破坏制表符分隔的解析。您需要指定sep='\t'

    dtypes_dict = {
        0: int, # geonameid
        1: unicode,  # name
        2: str,  # asciiname
        3: str,  # alternatenames
        4: float, # latitude
        5: float, # longitude
        6: str, # feature class
        7: str, # feature code
        8: str, # country code
        9: str, # cc2
        10: str, # admin1 code
        11: str, # admin2 code
        12: str, # admin3 code
        13: str, # admin4 code
        14: int, # population
        15: int, # elevation
        16: int, # dem (digital elevation model)
        17: str, # timezone
        18: str # modification date yyyy-MM-dd
    }
    
    data = pd.read_csv("TR.txt", sep="\t", header = None, dtype=dtypes_dict)
    data.to_csv('output.txt', sep='\t')
    

我没有解析最后的日期列,因为它可能不相关。


我没有使用你这里的dtypes_dict,因为当我导入时,高程被识别为浮点数,而其他变量数据类型已经很好了。不过我不知道在输出时必须指定分隔符,所以非常感谢你的帮助! - hope288
2
指定数据类型可以加快读取速度,因为解析器不必猜测数据类型。 - Alexander
好的,我会确保这样做。非常感谢! - hope288
请注意:在 Python 3+ 中,unicode 可以直接用 str 表示。 - dangel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接