所以我正在阅读NOAA的电台代码csv文件,如下所示:
"USAF","WBAN","STATION NAME","CTRY","FIPS","STATE","CALL","LAT","LON","ELEV(.1M)","BEGIN","END"
"006852","99999","SENT","SW","SZ","","","+46817","+010350","+14200","",""
"007005","99999","CWOS 07005","","","","","-99999","-999999","-99999","20120127","20120127"
前两列包含气象站的代码,有时它们有前导零。当pandas在没有指定dtype的情况下导入它们时,它们会变成整数。这并不是什么大不了的事,因为我可以遍历数据框索引并用"%06d" % i
之类的东西替换它们,因为它们总是六位数,但是你知道......这就是懒人的方式。
使用以下代码获取csv:
file = urllib.urlopen(r"ftp://ftp.ncdc.noaa.gov/pub/data/inventories/ISH-HISTORY.CSV")
output = open('Station Codes.csv','wb')
output.write(file.read())
output.close()
这一切都很好,但是当我去尝试用它阅读时:
import pandas as pd
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': np.str, 'WBAN': np.str})
或
import pandas as pd
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': str, 'WBAN': str})
我收到一条令人讨厌的错误消息:
File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 401, in parser
_f
return _read(filepath_or_buffer, kwds)
File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 216, in _read
return parser.read()
File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 633, in read
ret = self._engine.read(nrows)
File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 957, in read
data = self._reader.read(nrows)
File "parser.pyx", line 654, in pandas._parser.TextReader.read (pandas\src\parser.c:5931)
File "parser.pyx", line 676, in pandas._parser.TextReader._read_low_memory (pandas\src\parser.c:6148)
File "parser.pyx", line 752, in pandas._parser.TextReader._read_rows (pandas\src\parser.c:6962)
File "parser.pyx", line 837, in pandas._parser.TextReader._convert_column_data (pandas\src\parser.c:7898)
File "parser.pyx", line 887, in pandas._parser.TextReader._convert_tokens (pandas\src\parser.c:8483)
File "parser.pyx", line 953, in pandas._parser.TextReader._convert_with_dtype (pandas\src\parser.c:9535)
File "parser.pyx", line 1283, in pandas._parser._to_fw_string (pandas\src\parser.c:14616)
TypeError: data type not understood
这是一个相当大的csv(31k行),所以可能与它有关?
答案 0 :(得分:6)
在解析带序列号的文件时,这个问题引起了各种各样的麻烦。由于未知原因,00794和000794是两个不同的序列号。我最终想出了
converters={'serial_number': lambda x: str(x)}
答案 1 :(得分:6)
这是 pandas dtype guessing 的问题。
Pandas看到数字和猜测你希望它是数字。
为了让大熊猫不要怀疑你的意图,你应该设置你想要的dtype: object
pd.read_csv('filename.csv', dtype={'leading_zero_column_name': object})
会做的伎俩
答案 2 :(得分:3)
如果您不希望它成为对象,则必须指定字符串的长度 例如:
dtype={'USAF': '|S6'}
我找不到这方面的参考,但我似乎回想起Wes正在讨论这个问题(也许是在谈话中)。他建议numpy不允许“正确的”可变长度字符串(参见此question/answer),并且使用最大长度填充数组通常会使空间效率低得令人难以置信(即使字符串很短)将使用与最长字符串一样多的空间。
正如@Wes指出的那样,这也是一个案例:
dtype={'USAF': object}
同样适用。
答案 3 :(得分:0)
您可以将函数字典传递给var object = {
eventOne(){
console.log("eventOne")
},
eventTwo(){
console.log("eventTwo")
}
}
//and then this for calling them
for(event in object){
object[ event]();
}
,其中键是数字列索引。因此,如果您不知道列名是什么,则可以执行此操作(前提是您的列数少于100个)。
firebase deploy
答案 4 :(得分:0)
使用Pandas 1,怎么样:
handleRead
请注意,将使用列dtype df.read_csv(..., dtype={"my_confusing_col": "string"})
,该列将string
用于任何缺少的值。当然,所有前导零都将保留。