gpt4 book ai didi

python - 当使用 pandas 读取两个略有不同的 CSV 文件时,其中一个的处理方式与另一个不同。为什么?

转载 作者:行者123 更新时间:2023-12-01 04:51:01 29 4
gpt4 key购买 nike

我正在对数据集进行各种分析和绘图。

我从政府网站获取 CSV 文件形式的数据集。根据数据类型的不同,CSV 文件略有不同:

  • header 长度
  • 标题内容
  • 列数
  • NaN 值的数量
  • 每月或每日数据
  • 值的大小

首先,我使用 python 标准 CSV 阅读器读取前 50 行,以搜索稍后需要的各种字符串并找出标题的实际长度。

下一步是用 sed 替换一些内容(更改列的名称,将 , 替换为 . 作为小数)。

然后我用

阅读它
Mydata=pd.read_csv(csv_list[counter],sep=';',skiprows=DataStart,index_col='Date',usecols=0,1],dayfirst=True,parse_dates=True,na_values='L\xfccke')

现在我的问题来了 - 有以下两个 CSV,第一个有效,第二个无效:

这个:

...20 more lines of header
Werteformat: ;1 Nachkommast.
Date;level
01.01.1971 07:00:00 ; 0.0
02.01.1971 07:00:00 ; 0.0
03.01.1971 07:00:00 ; 0.0
...15000 lines of data
01.01.2012 07:00:00 ;Lücke

有效,而这个

...30 more lines of header
Werteformat: ;2 Nachkommast.
Date;level;
01.01.1970 00:00:00 ; 427.27 ;
01.02.1970 00:00:00 ; 427.80 ;
...500 lines of data, with stuff like
01.03.1973 00:00:00 ;Lücke ;
in between

尝试绘制直方图时出错

Traceback (most recent call last):
File "plotter.py", line 179, in <module>
plt.hist(Jan_RV)
File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 2827, in hist
stacked=stacked, **kwargs)
File "/usr/lib64/python2.7/site-packages/matplotlib/axes.py", line 8326, in hist
m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
File "/usr/lib64/python2.7/site-packages/numpy/lib/function_base.py", line 176, in histogram
mn, mx = [mi+0.0 for mi in range]
TypeError: cannot concatenate 'str' and 'float' objects

好吧,看来有些东西被读取为字符串,通过在 ipython 中运行某些部分,我发现它是 Lücke 部分,他们选择将其用作 NaN 缺失数据 代表者。我以为我已经用 read_csv 中的 na_values='L\xfccke' 解决了这个问题,并且对于第一个数据集,它确实有效。如果我在 ipython 中查看 MyData,我会看到 NaN 而不是 Lücke,而对于第二个数据集,Lücke > 停留。

[编辑] 怀疑元音变音 ü 导致问题可能是错误的?我手动将 Lücke 更改为 NaN,并删除了 read_csv 中的 na_values='L\xfccke'它仍然将文本部分(现在为 NaN)保留为字符串。我也有

Rlength=len(MyData)   #counts everything, including NaN
Rcount=MyData.count() #counts only valid numbers
NaN_Number=Rlength-Rcount

在我的脚本中,对于第二个数据集,它总是导致 0 NaN_Numbers [/edit]

这可能是什么原因? na_values 是否只取第一个值,然后停止?我在第二个数据集中有空列是否会导致问题?但这并不重要,因为我只使用前两个,使用 usecols=[0,1]

另一个明显的区别是第一组是每日数据,第二组是每月数据,但这并不重要。我还有一些其他的每月数据,确实有效。

我的一个想法是,CSV 文件可能有不同的行结尾(这是正确的术语吗?Unix 与 Windows,或回车符与换行符)或编码,但看起来在我的编辑器中,它告诉我它们是相同的。终端中的 stat filename.csv 也得到了非常相似的结果。

所以我完全迷失了。

编辑2:*简短的 CSV 文件示例:

Werteformat:               ;2 Nachkommast.
Date ;level ;
01.10.1982 00:00:00 ; 873.33 ;
01.11.1982 00:00:00 ; 873.19 ;
01.12.1982 00:00:00 ;Lücke ;
01.01.1983 00:00:00 ;Lücke ;
01.02.1983 00:00:00 ; 873.17 ;

阅读(已包含@mhawke答案的一些更改):

Tester2=pd.read_csv('test2.csv',sep=r'\s*;',skiprows=1,index_col='Date',dayfirst=True,parse_dates=True,na_values='Lücke',usecols=[0,1])

结果

In [598]: Tester2
Out[598]:
level Unnamed: 2
Date
1982-10-01 873.33 NaN
1982-11-01 873.19 NaN
1982-12-01 NaN NaN
1983-01-01 NaN NaN
1983-02-01 873.17 NaN

最佳答案

第二个文件中的 level 列的值包括尾随空格。这是因为第二个文件在 level 之后有一个附加列,如标题和行中的尾随分隔符所示,因此空格被视为字段的一部分。考虑这个文件,它是第二个文件的最小示例(注意尾随分隔符 ;):

Date;level;
01.01.2012 07:00:00 ;Lücke ;

>>> import pandas as pd
>>> data = pd.read_csv('2.csv', sep=';')
>>> data['level'][0]
'L\xc3\xbccke '

值中包含尾随空格,因此 na_values 必须包含空格(请注意我的系统上的 UTF8 编码):

>>> data = pd.read_csv('2.csv', sep=';', na_values=['L\xc3\xbccke'])    # no space
>>> data['level'][0]
'L\xc3\xbccke '

>>> data = pd.read_csv('2.csv', sep=';', na_values=['L\xc3\xbccke ']) # with space
>>> data['level'][0]
nan

所以我认为这基本上就是您问题的原因。您可以尝试将 sep 指定为正则表达式 r'\s*;' 来删除所有列中的尾随空格,这应该适用于您的两个文件,以及其他可能具有不同数量尾随空格的文件。

>>> data = pd.read_csv('2.csv', sep=r'\s*;', na_values=['L\xc3\xbccke'])    # no spaces required
>>> data['level'][0]
nan

但是:

  1. 将从所有列中删除空格,但这可能不会给你带来麻烦。
  2. 将使用 Python 解析器引擎代替“c”引擎因为后者不支持正则表达式分隔符。警告是发布可能是因为 Python 会比较慢。

如果上面 2 是一个问题,修复它很困难,因为 read_csv() 没有选项来去除尾随空格。您可以将 strip() 作为 converter 字典中的函数提供,但这不会影响匹配 na_values 的处理。也许您可以在使用 sed 预处理文件时删除空格。

此外,您可能需要确保在 na_values 中使用正确的字符串字符编码,以匹配数据文件的字符编码。如果需要,您可以使用 encoding 参数。

关于python - 当使用 pandas 读取两个略有不同的 CSV 文件时,其中一个的处理方式与另一个不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475454/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com