【问题标题】:What's the difference between dtype and converters in pandas.read_csv?pandas.read_csv 中的 dtype 和转换器有什么区别?
【发布时间】:2015-12-07 17:02:46
【问题描述】:

pandas 函数 read_csv() 读取一个 .csv 文件。它的文档是here

根据文档,我们知道:

dtype : 类型名称或列的字典 -> 类型,默认无 数据类型 用于数据或列。例如。 {‘a’:np.float64,‘b’:np.int32} (engine='python' 不支持)

converters : dict,默认 None 用于转换的函数的字典 某些列中的值。键可以是整数或列 标签

当使用这个函数时,我可以调用 pandas.read_csv('file',dtype=object)pandas.read_csv('file',converters=object)。很明显converter,它的名字可以说数据类型会被转换,但我想知道dtype的情况?

【问题讨论】:

    标签: python pandas types converter type-inference


    【解决方案1】:

    语义上的区别在于dtype 允许您指定如何处理这些值,例如,作为数字类型还是字符串类型。

    Converters 允许您解析输入数据以使用转换函数将其转换为所需的 dtype,例如,将字符串值解析为 datetime 或其他一些所需的 dtype。

    在这里我们看到 pandas 试图嗅探类型:

    In [2]:
    df = pd.read_csv(io.StringIO(t))
    t="""int,float,date,str
    001,3.31,2015/01/01,005"""
    df = pd.read_csv(io.StringIO(t))
    df.info()
    
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 1 entries, 0 to 0
    Data columns (total 4 columns):
    int      1 non-null int64
    float    1 non-null float64
    date     1 non-null object
    str      1 non-null int64
    dtypes: float64(1), int64(2), object(1)
    memory usage: 40.0+ bytes
    

    从上面可以看出001005 被视为int64,但日期字符串仍为str

    如果我们说一切都是object,那么基本上一切都是str

    In [3]:    
    df = pd.read_csv(io.StringIO(t), dtype=object).info()
    
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 1 entries, 0 to 0
    Data columns (total 4 columns):
    int      1 non-null object
    float    1 non-null object
    date     1 non-null object
    str      1 non-null object
    dtypes: object(4)
    memory usage: 40.0+ bytes
    

    这里我们将int 列强制为str 并告诉parse_dates 使用date_parser 来解析日期列:

    In [6]:
    pd.read_csv(io.StringIO(t), dtype={'int':'object'}, parse_dates=['date']).info()
    
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 1 entries, 0 to 0
    Data columns (total 4 columns):
    int      1 non-null object
    float    1 non-null float64
    date     1 non-null datetime64[ns]
    str      1 non-null int64
    dtypes: datetime64[ns](1), float64(1), int64(1), object(1)
    memory usage: 40.0+ bytes
    

    类似地,我们可以通过 to_datetime 函数来转换日期:

    In [5]:
    pd.read_csv(io.StringIO(t), converters={'date':pd.to_datetime}).info()
    
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 1 entries, 0 to 0
    Data columns (total 4 columns):
    int      1 non-null int64
    float    1 non-null float64
    date     1 non-null datetime64[ns]
    str      1 non-null int64
    dtypes: datetime64[ns](1), float64(1), int64(2)
    memory usage: 40.0 bytes
    

    【讨论】:

    • 我应该向其他人指出,这两个参数可以在同一个 read_csv 调用中提供,尽管我没有测试 dtypesconverters 字典中引用的重叠列如果使用该 API。
    • 有没有办法制作自己的嗅探器来转换数据类型?我觉得这对包含许多列的 excel 文件很有用。
    • 这不起作用 excel 工作表是使用第 3 方模块导入的,因此 dtypes 是通过该模块提供的。如果它是一个 csv 文件,那么您可以定义自己的函数并将其加载到转换器并将其应用于每一列,这样就可以了
    • 在回复@jxramos 评论时,converters 优先于 dtypes,以防两个参数中引用相同的列,至少在 pandas 1.3.1 上
    【解决方案2】:

    我想说converters 的主要目的是操作列的值,而不是数据类型。 @EdChum 分享的答案集中在dtypes 的想法上。它使用pd.to_datetime 函数。

    在这篇关于转换器的文章https://medium.com/analytics-vidhya/make-the-most-out-of-your-pandas-read-csv-1531c71893b5 中,您将看到一个示例,该示例将具有诸如“185 lbs.”之类的值的 csv 列更改为删除“lbs”的内容" 来自文本列。这更多是read_csv converters 参数背后的想法。

    .csv 的样子(如果图片没有显示,请转到文章。)

    #creating functions to clean the columns
    w = lambda x: (x.replace('lbs.',''))
    r = lambda x: (x.replace('"',''))
    #using converters to apply the functions to the columns
    fighter = pd.read_csv('raw_fighter_details.csv' , 
                          converters={'Weight':w , 'Reach':r }, 
                          header=0, 
                          usecols = [0,1,2,3])
    fighter.head(15)
    

    在权重列上使用converters 后的DataFrame

    【讨论】:

    • 请注意,r lambda 函数用于Reach 列,而不是高度列。
    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2019-07-11
    • 2019-06-09
    • 2014-08-02
    • 2010-11-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多