如何在导入CSV后更改Pandas数据框中的数据类型“对象”?

时间:2017-05-07 18:15:48

标签: python-3.x pandas

我已将CSV文件导入为Pandas数据帧。当我运行df.dtypes时,我将大多数列作为“对象”,这对于获取图表的Bokeh来说是无用的。

  1. 我需要将列更改为int,将另一列更改为date,其余列更改为字符串。
  2. 我只在导入数据后才看到数据类型。您是否建议在导入期间更改它(如何?)或导入后?

3 个答案:

答案 0 :(得分:3)

我认为read_csv中的datetime需要parse_dates参数。

如果您有int列但未获得int64 dtype,我认为有些strings可能是empty strings,因为read_csv是自动的施放dtypes

然后需要按to_numeric将错误数据转换为NaN - 但要获取float列,因为NaN具有float类型。因此,需要将NaN替换为某个int(例如0),然后转换为int

df['col_int'] = pd.to_numeric(df['col_int'], errors='coerce').fillna(0).astype(int)

样品:

import pandas as pd
from pandas.compat import StringIO

temp=u"""a;b;c;d
A;2015-01-01;3;e
S;2015-01-03;4;r
D;2015-01-05;5r;t"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep=";", parse_dates=[1])
print (df)
   a          b   c  d
0  A 2015-01-01   3  e
1  S 2015-01-03   4  r
2  D 2015-01-05  5r  t

print (df.dtypes)
a            object
b    datetime64[ns]
c            object
d            object
dtype: object

df['c'] = pd.to_numeric(df['c'], errors='coerce').fillna(0).astype(int)
print (df)
   a          b  c  d
0  A 2015-01-01  3  e
1  S 2015-01-03  4  r
2  D 2015-01-05  0  t

print (df.dtypes)
a            object
b    datetime64[ns]
c             int32
d            object
dtype: object

对于更改dtypes需要dtype参数:

temp=u"""a;b;c;d
A;10;3;e
S;2;4;r
D;6;1;t"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep=";", dtype={'b':str, 'c':float})
print (df)
   a   b    c  d
0  A  10  3.0  e
1  S   2  4.0  r
2  D   6  1.0  t

print (df.dtypes)
a     object
b     object
c    float64
d     object
dtype: object

答案 1 :(得分:0)

在阅读csv文件时:

在pandas中的read_csv中使用dtype或converters属性

import pandas as pd import numpy as np df = pd.read_csv('data.csv',dtypes = {'a':float64,'b':int32},headers=None)

此处,类型将自动读取为您指定的数据类型。

阅读完csv文件后:

使用astype函数更改列类型。

检查此代码。 考虑你有两列

df[['a', 'b']] = df[['a', 'b']].astype(float)

这样做的好处是可以一次更改多个列的类型。

答案 2 :(得分:0)

使用 one-hot 编码。

这里数据类型从对象转换为类别,然后转换为 int64。 但是这种方法用于分类数据。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
dataframe = pd.read_csv('path//filename.csv')
dataframe ["attribute"] = dataframe ["attribute"].astype('category')
dataframe ["attribute_cat"] = dataframe ["attribute"].cat.codes