如何使 pandas read_csv 处理 numpy str(或 unicode)标量数据类型

how to make pandas read_csv handle numpy str (or unicode) scalar datatypes

每当我读取包含一列字符串的 CSV 文件时,我发现默认情况下 pandas 将其 dtype 作为 object。我尝试使用 mydf['mycol'].astype(str) 将列 mycoldtypeobject 更改为 str,但它没有用 - 它没有' t 给我一个错误,但与此同时,dtype 保持不变。

我读到 pandas 是建立在 numpy 之上的,numpy 允许 str_unicode_ see here: numpy scalar types .我不太熟悉 pandas 的内部工作原理,也不熟悉 numpy 的一般情况。

  1. 在使用 pandas.io.parsers.read_csv 时我能做些什么来确保 CSV 文件中的一列字符串被读取为 strdtype 而不是 object?

更具体地说,我需要使用哪些参数(根据下面给出的参数)来实现此目的?

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)
  1. 有点相关:pandas.io.parsers.read_csv的参数中是否有任何变量/标志可以自动从字符串列中读取缺失的字符串作为''(空字符串)而不是读取缺失的字符串字符串为 nan?

此外,文档中未描述可传递给 pandas.io.parsers.read_csv 的许多参数:pandas.io.parsers.read_csv.html 例如,na_fvaluesuse_unsignedcompact_ints,等等。除了阅读代码(有点长),还有什么地方可以提供所有参数的更详细的文档吗?

这是 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')

举个傻逼的例子,我们可以看一个object 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 字符串也有一些 "surprising" 行为(也是由于它们的布局):

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')

如果您想修复此行为 - 并保留 numpy 字符串 dtype - 您将必须为每个作业制作一个副本。 (对于对象数组,您可以免费获得此功能:只需更改指针即可。)


因此在 pandas 中,字符串是使用对象 dtype 存储的。

注意:我认为文档中有一部分讨论了这个决定,但我似乎找不到它...