【问题标题】:Use Non breakable space as thousands separator in pandas read_csv function在 pandas read_csv 函数中使用不可破坏的空间作为千位分隔符
【发布时间】:2020-10-13 13:36:14
【问题描述】:

我有一个 iso-8859-1 格式的 csv 文件要导入到 pandas 数据框。

read_csv 函数非常适合。

但是 csv 使用不可破坏的空间作为千位分隔符,我似乎无法删除它。

read_csv 函数中有数千个属性,但无论我放在那里,牢不可破的空格仍然存在。

我尝试了以下方法,结果都一样:

data_sheet = pd.read_csv(path_to_csv, encoding="iso-8859-1", thousands=' ')
data_sheet = pd.read_csv(path_to_csv, encoding="iso-8859-1", thousands=chr(160'))
data_sheet = pd.read_csv(path_to_csv, encoding="iso-8859-1", thousands=u'\xa0')
data_sheet = pd.read_csv(path_to_csv, encoding="iso-8859-1", thousands='\xa0')
data_sheet = pd.read_csv(path_to_csv, encoding="iso-8859-1", thousands=unicodedata.lookup('NO-BREAK SPACE'))

由于它无法解析它,pandas 将其视为字符串并在我尝试转换时返回以下错误

ValueError: could not convert string to float: '1\xa0279,92'

【问题讨论】:

  • 能否显示包含'1\xa0279,92' 的原始数据行? '1\xa0279,92' 中的逗号是 CSV 文件的小数点还是逗号分隔符?
  • 小数点是',',字段分隔符是';'。为了清楚起见,我从帖子中删除了这些参数。完整的命令如下。 data_sheet = pd.read_csv(temp_file, header=25, encoding="iso-8859-1", sep=';', decimal=',',数千=' ')
  • 这里是一个完整行的例子。有 175 列,所以它太长了,但这里有一部分有问题的字段:0,11;1 279,92;1 324,21;1 302,14;10,65;2 707,77;2 951,71;2 829,40
  • 好的。您可以编辑您的帖子以包含信息。

标签: python pandas


【解决方案1】:

pd.read_csv 支持两种解析器引擎:C 和 Python。根据doc

The C engine is faster while the python engine is currently more feature-complete.

我做了一些测试,它看起来像 C 引擎——这是大多数情况下的默认选择——只能处理基本 ASCII 字母的千位和小数分隔符 ('\x0' - '\x7f');仅 Python 引擎支持使用'\xa0' 作为千位分隔符。

data = "0,11;1\xa0279,92;1\xa0324,21;1\xa0302,14;10,65;2\xa0707,77;2\xa0951,71;2\xa0829,40"
df = pd.read_csv(io.StringIO(data), header=None, encoding="iso-8859-1",
                 sep=';', decimal=',', thousands='\xa0', engine="python")
df.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1 entries, 0 to 0
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   0       1 non-null      float64
 1   1       1 non-null      float64
 2   2       1 non-null      float64
 3   3       1 non-null      float64
 4   4       1 non-null      float64
 5   5       1 non-null      float64
 6   6       1 non-null      float64
 7   7       1 non-null      float64
dtypes: float64(8)
memory usage: 192.0 bytes

【讨论】:

  • 添加 engine='python' 时,它就像一个魅力 :-) 感谢您的提示!
【解决方案2】:

即使加入了decimal=','dtype=...,我也无法让thousands=... 工作。

对我有用的是提供converter

希望其他对 pandas 有更多经验的人可以向我们展示如何正确使用千位。

import pandas as pd
import io


def to_float(s):
    return float(s.replace('\xa0', '').replace(',', '.'))


data = '''\
a,b,c
foo,bar,"1\xa0279,92"
foo,bar,"2\xa0280,93"
foo,bar,"3\xa0281,94"
foo,bar,"4\xa0282,95"
'''

f = io.StringIO(data)
df = pd.read_csv(f, converters={'c': to_float})

print(df)

【讨论】:

  • 我最终做的是首先使用标准 python open() 命令将文件打开为 txtfile,然后删除所有牢不可破的空间,然后将其保存为新文件,最后使用 pandas 导入.它有效,但您的方式更加优雅。谢谢:-)
猜你喜欢
  • 2017-07-06
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多