【问题标题】:Importing a table into pandas and specifying the data type with missing values将表导入 pandas 并指定缺失值的数据类型
【发布时间】:2017-03-11 03:49:07
【问题描述】:

我在 pandas/Python 中使用 read_table 命令导入制表符分隔的文本文件。

q_data_1 = pd.read_table('data.txt', skiprows=6, dtype={'numbers': np.float64})

...但是得到

AttributeError: 'NoneType' object has no attribute 'dtype'

如果没有 dtype 参数,该列将作为“对象”dtype 导入。

我认为“数字”列缺少导致导入失败的数据。如何忽略这些值?

编辑(13 年 5 月 25 日):知道如何使用包含 (i) 时间(例如“00:03:06”)(ii) 日期(例如“2002-03-11”)的列执行此操作和百分比('32.81%')?所有这些都转换为对象。 (我编辑了 Q 以反映)(iv)带逗号的数字(例如“10,982”)以将它们转换为适当的 dtype?

【问题讨论】:

  • 如果没有你指定,它不会得到这个 dtype 吗?
  • 不 - 它将整个列作为对象导入
  • “数字”中有什么不是浮点数?你希望它是怎样的?
  • 什么是 'AttributeError: 'NoneType' object has no attribute 'dtype' - 这是否意味着它不能将其中一个数字转换为浮点数?
  • 看到这个问题:stackoverflow.com/questions/16729483/…,你应该把它读进去然后转换(因为我假设你文件中的分隔符不是逗号)

标签: python pandas


【解决方案1】:

读入 DataFrame(不限制 dtype)后,您可以使用 apply 转换它(使用 technique from this post):

import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8')
df = pd.DataFrame([['1,002.01'], ['300,000,000.1'], ['10']], columns=['numbers'])

In [4]: df['numbers']
Out[4]:
0         1,002.01
1    300,000,000.1
2               10
Name: numbers, dtype: object

In [5]: df['numbers'].apply(locale.atof)
Out[5]:
0    1.002010e+03
1    3.000000e+08
2    1.000000e+01
Name: numbers, dtype: float64

In[6]: df['numbers'] = df['numbers'].apply(locale.atof)

【讨论】:

  • 顺便说一句,知道如何对包含 (i) 时间(例如 '00:03:06')(ii)日期(例如 '2002-03-11')的列做同样的事情和百分比('32.81%')?所有这些都转换为对象。 (我已编辑 Q 以反映)
  • 你不应该编辑这个问题,而应该问一个新问题:)。在这两种情况下本质上是相同的技巧(只需定义一个函数,将其应用于单个字符串,然后将其应用于列)。
  • 好的就行。这是这样做的有效方法吗?因为我使用 Pandas 是因为它使用 C 库有效地处理大型数据集。
  • 这是一个很好的问题,但我的建议是使用这个,看看它是否足够有效,我认为它会相当有效。 read_csv 有一个转换器参数,可能值得研究......
  • 感谢您的帮助。可能值得作为一个单独的问题提出;)
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 2016-11-26
  • 2019-05-01
  • 1970-01-01
  • 2019-09-20
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多