使用 Pandas python 从 geonames 导入文本文件

hop*_*288 3 import export geonames python-3.x pandas

我从geonames下载了一个国家数据集,并使用这一行将数据集解析为列:

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

但由于某种原因,这不能正确解析所有行。大多数行都被正确解析,大约 2K 没有被正确解析。我使用这一行能够看到它没有被正确解析:

data.to_csv("C:/Users/Documents/output.csv")
Run Code Online (Sandbox Code Playgroud)

然后我在excel中打开output.csv,看到有些行没有被解析。但是,当我在 excel 上打开原始 TR.txt 数据集并使用制表符分隔符时,所有行都正确显示为已解析。所以我在我的 python 代码中做错了什么,但我不知道是什么。我输出的数据集错了吗??谢谢

Ale*_*der 6

始终阅读 readme.txt 文件。

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

1) 海拔(第 15 列)应为整数,但包含空白。如果您指定一个 int 作为数据类型,这将产生一个错误,因为 int 没有 NaN 值。解决方法是将其转换为浮点数。如果你真的想要一个int,那么为缺失的字段创建一个标记值(例如-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')
Run Code Online (Sandbox Code Playgroud)

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

  • 指定 dtypes 会导致读取速度更快,因为解析器不必猜测数据类型。 (2认同)