Python 3.x 如何使pandas读取\u csv句柄numpy str(或unicode)标量数据类型
每当我读取一个包含一列字符串的CSV文件时,我发现默认情况下,Python 3.x 如何使pandas读取\u csv句柄numpy str(或unicode)标量数据类型,python-3.x,numpy,pandas,Python 3.x,Numpy,Pandas,每当我读取一个包含一列字符串的CSV文件时,我发现默认情况下,pandas将其dtype作为object提供。我曾尝试使用mydf['mycol'].astype(str)将mycol列的dtype从object更改为str,但没有起作用-它没有给我一个错误,但同时dtype保持不变 我听说熊猫是在numpy的基础上构建的,numpy同时支持str和unicode。我不太熟悉pandas的内部工作原理,也不太熟悉numpy 当使用pandas.io.parsers.read_csv以确保csv文
pandas
将其dtype
作为object
提供。我曾尝试使用mydf['mycol'].astype(str)
将mycol
列的dtype
从object
更改为str
,但没有起作用-它没有给我一个错误,但同时dtype
保持不变
我听说熊猫是在numpy
的基础上构建的,numpy
同时支持str
和unicode
。我不太熟悉pandas
的内部工作原理,也不太熟悉numpy
pandas.io.parsers.read_csv
以确保csv文件中的字符串列被读取为str
的dtype
而不是对象时,我能做些什么
pandas.io.parsers.read_csv(filepath_or_buffer, sep=', ', dialect=None,
compression=None, doublequote=True, escapechar=None, quotechar='"', quoting=0,
skipinitialspace=False, lineterminator=None, header='infer', index_col=None,
names=None, prefix=None, skiprows=None, skipfooter=None, skip_footer=0,
na_values=None, na_fvalues=None, true_values=None, false_values=None,
delimiter=None, converters=None, dtype=None, usecols=None, engine=None,
delim_whitespace=False, as_recarray=False, na_filter=True, compact_ints=False,
use_unsigned=False, low_memory=True, buffer_lines=None, warn_bad_lines=True,
error_bad_lines=True, keep_default_na=True, thousands=None, comment=None,
decimal='.', parse_dates=False, keep_date_col=False, dayfirst=False,
date_parser=None, memory_map=False, float_precision=None, nrows=None,
iterator=False, chunksize=None, verbose=False, encoding=None, squeeze=False,
mangle_dupe_cols=True, tupleize_cols=False, infer_datetime_format=False,
skip_blank_lines=True)
pandas.io.parsers.read_csv
的参数中是否有任何变量/标志,可以自动从字符串列中读取缺少的字符串作为'
(空字符串),而不是读取缺少的字符串作为nan
此外,文档中没有描述可以传递给熊猫.io.parsers.read\u csv的许多参数:例如,
na\u fvalues
,使用无符号的
,压缩整数
,等等。除了读取代码(有点长)之外,是否有其他地方可以提供所有参数的更详细文档?这是Wes做出的技术决定,而不是使用numpy的字符串数据类型:numpy将所有字符串分配为相同的大小
在大多数真实世界的用例中,字符串的大小不是固定的,并且通常有一些字符串非常长。分配一个非常大的连续内存块(和IIRC,
与直觉相反,可能会更慢!)将其存储为固定大小:
In [11]: np.array(["ab", "a"]) # The 2 is the length
Out[11]:
array(['ab', 'a'],
dtype='|S2')
In [12]: np.array(['this is a very long string', 'a', 'b', 'c'])
Out[12]:
array(['this is a very long string', 'a', 'b', 'c'],
dtype='|S26')
举一个愚蠢的例子,我们可以看到一个对象dtype占用更少内存的例子:
In [21]: a = np.array(['a'] * 99 + ['this is a very long string, really really really really really long, oh yes'])
In [22]: a.nbytes
Out[22]: 7500
In [23]: b = a.astype(object)
In [24]: b.nbytes + sum(sys.getsizeof(item) for item in b)
Out[24]: 4674
numpy字符串也有一些“令人惊讶”的行为(也是由于它们的布局): 如果您想修复此行为并保留numpy字符串数据类型,则必须为每个作业制作一个副本。(使用对象数组,您可以免费获得:只需更改指针即可。)
因此,在pandas中,字符串是使用对象数据类型存储的
注意:我原以为文档中有一部分讨论了这个决定,但我似乎找不到它…你大错特错了
对象
只是描述数组类型的数据类型,它被存储为str
,您不需要在此处执行任何操作。您可以将数据类型作为dict作为参数传递到read_csv
默认情况下,由空数据组成的列将被视为float,以便可以表示NaN
。我不想传递dtypes
,因为我事先不知道这些列。我不确定您的判断是否正确“object
只是描述数组类型的dype,它被存储为str
”部分。由于object
与str
是不同的数据类型,除了generic
之外,这两个数据类型甚至没有父/子关系。您有任何参考/文档说明”object
只是描述数组类型的dype,它被存储为str
“?尝试na_filter=False
Hmmm在这个例子中,它使它看起来更接近,我认为在现实世界中它不是:一般来说,对象要小得多。我尝试了a=np.array([“abc”,“de”,“y”)
,b=a.astype(object)
,对于b:print(sys.getsizeof(item))
中的项,我得到52,51,54对应于“abc”、“de”、“y”。你知道为什么字符串中的字符减少了,但大小却没有减少吗?@uday这很奇怪。(在python 2中)我得到[40,39,38]和[56,54,52]对于unicode-与您不同。我想知道getsizeof在这里是否不一定准确?注意:对于python对象,前40或50(对于unicode)字节是开销,差异是数据(实际字符串指向的位置),因此您应该看到您所期望的差异(尽管某些unicode字符比其他字符长)。感谢分享第二个示例。这绝对是一个交易破坏者。我发现,在我的机器上,通常情况下,如果字符串大小大致相同,那么np.array
的字符串版本比object
版本占用的内存更少。例如a=numpy.array([“a”、“b”、“c”、“d”、“E”、“f”、“g”、“h”、“I”、“j”、“k”、“l”)“,”m“,”n“,”o“,”p“,”q“,”r“,”s“,”t“,”u“,”v“,”w“,”x“,”y“,”z“)
,a.nbytes
给出104,而b.nbytes+和(b中项目的sys.getsizeof(项目))
给出了1612。仍然无法找出对象
类的字节大小的公式。可能是PY2与PY3@uday我觉得getsizeof是悲观的(还需要记住的是,对于numpy,它必须是连续的,因此在实际示例中,它实际上很容易耗尽内存—因为您没有这么大的空闲块—但会有很多小块)我真的不太担心这种差异:)
In [31]: a = np.array(['ab', 'c'])
In [32]: a[1] = 'def'
In [33]: a # what the f?
Out[33]:
array(['ab', 'de'],
dtype='|S2')