【问题标题】:Import text file from geonames using pandas python使用 pandas python 从地名导入文本文件
【发布时间】:2016-04-02 14:12:15
【问题描述】:

我从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 数据集并使用制表符分隔符时,所有行都正确显示为已解析。所以我在我的python代码中做错了,但我不知道是什么。 我输出数据集错误吗? 谢谢

【问题讨论】:

  • 在 Excel 中以制表符分隔打开 TR.txt 显示至少 7 行未正确解析,第一行是第 15191 行,第一列中的值为 311071 - 你也得到这个吗?
  • 您的RAM 的大小是多少?

标签: python-3.x pandas import export geonames


【解决方案1】:

始终阅读 readme.txt 文件。

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

1) 海拔(第 15 列)应为 int,但包含空格。如果将 int 指定为数据类型,则会产生错误,因为 int 没有 NaN 值。解决方法是将其转换为浮点数。如果你真的想要一个 int,那么为缺失的字段创建一个标记值(例如 -99999),用这个值填充na(),然后转换为一个 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,因为在我导入时海拔被识别为浮点数,而其他变量数据类型也很好。我不知道我必须在输出时指定分隔符,所以非常感谢!
  • 指定数据类型可以加快读取速度,因为解析器不必猜测数据类型。
  • 哦,好的,我会确保这样做。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2021-10-29
  • 2020-01-09
  • 2013-08-12
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多