Python 3.x 如何使pandas读取\u csv句柄numpy str(或unicode)标量数据类型

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文

每当我读取一个包含一列字符串的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')