pandas.read_csv中dtype和转换器之间有什么区别?

Bry*_*yan 16 python types type-inference converter pandas

pandas函数read_csv()读取.csv文件.它的文档在这里

根据文件,我们知道:

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

converter:dict,default无用于转换某些列中的值的函数的字典.键可以是整数或列标签

使用此功能时,我可以调用 pandas.read_csv('file',dtype=object)pandas.read_csv('file',converters=object).显然,转换器,它的名字可以说数据类型将被转换,但我想知道dtype的情况?

EdC*_*ica 17

语义差异dtype允许您指定如何处理值,例如,数字或字符串类型.

转换器允许您使用转换函数解析输入数据以将其转换为所需的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
Run Code Online (Sandbox Code Playgroud)

您可以从上面看到001并被005视为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
Run Code Online (Sandbox Code Playgroud)

在这里,我们强制intstr并告诉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
Run Code Online (Sandbox Code Playgroud)

同样,我们可以传递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
Run Code Online (Sandbox Code Playgroud)

  • 回复 @jxramos 评论,如果两个参数中都引用了同一列,则“converters”优先于“dtypes”,至少在 pandas 1.3.1 上是如此 (2认同)

VIS*_*SQL 8

我想说的主要目的converters是操纵列的值,而不是数据类型。@EdChum 分享的答案重点关注dtypes. 它使用该pd.to_datetime功能。

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

.csv 是什么样的(如果图像未显示,请转到文章。)
具有 6 列的 csv 文件。 重量栏包含 145 磅等条目。

#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)
Run Code Online (Sandbox Code Playgroud)

在“重量”列上DataFrame使用后。converters
在此输入图像描述