- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在对数据集进行各种分析和绘图。
我从政府网站获取 CSV 文件形式的数据集。根据数据类型的不同,CSV 文件略有不同:
首先,我使用 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
但是:
如果上面 2 是一个问题,修复它很困难,因为 read_csv()
没有选项来去除尾随空格。您可以将 strip()
作为 converter
字典中的函数提供,但这不会影响匹配 na_values
的处理。也许您可以在使用 sed 预处理文件时删除空格。
此外,您可能需要确保在 na_values
中使用正确的字符串字符编码,以匹配数据文件的字符编码。如果需要,您可以使用 encoding
参数。
关于python - 当使用 pandas 读取两个略有不同的 CSV 文件时,其中一个的处理方式与另一个不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475454/
直接问题:对于一个类对象的三个(或更多)几乎相同的拷贝,我怎样才能最好(或最有效)地存储它们之间的差异? 背景:我有一个需要一组参数的算法: struct params { std::strin
我是一名优秀的程序员,十分优秀!