如何在pandas DataFrame中按列设置dtypes

时间:2014-09-01 17:27:37

标签: python pandas types

我想将一些数据带入pandas DataFrame,我想在导入时为每列分配dtypes。我希望能够为具有许多不同列的较大数据集执行此操作,但是,作为示例:

myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes

结果:

  

TypeError:数据类型不理解

我尝试了一些其他方法,例如:

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})
  

TypeError:类型为'type'的对象没有len()

如果我放dtype=(float,int),它会将浮动格式应用于两列。

最后,我希望能够传递一个数据类型列表,就像我可以传递一个列名列表一样。

4 个答案:

答案 0 :(得分:13)

我刚刚碰到这个,大熊猫问题仍然存在,所以我发布了我的解决方法。假设df是我的DataFrame而dtype是一个dict映射列名称到类型:

for k, v in dtype.items():
    df[k] = df[k].astype(v)

(注意:在python 2中使用dtype.iteritems()

供参考:

答案 1 :(得分:3)

您可能想尝试将Series个对象的字典传递给DataFrame构造函数 - 它会为您提供更具体的控制权,并希望能够更清楚地了解正在发生的事情。模板版本(data1可以是数组等。):

df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
                   'column2':pd.Series(data2, dtype='type2')})

数据示例:

df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
                   'B':pd.Series([7,8,9], dtype='float')})

print (df)
   A  B
0  1  7.0
1  2  8.0
2  3  9.0

print (df.dtypes)
A     int32
B    float64
dtype: object

答案 2 :(得分:1)

从pandas 0.24.2版(当前的稳定版本)开始,无法将文档类型的显式数据类型列表传递给DataFrame构造函数:

dtype : dtype, default None

    Data type to force. Only a single dtype is allowed. If None, infer

但是,dataframe类确实具有静态方法,使您可以将numpy结构化数组转换为数据框,从而可以执行以下操作:

>>> myarray = np.random.randint(0,5,size=(2,2))
>>> record = np.array(map(tuple,myarray),dtype=[('a',np.float),('b',np.int)])
>>> mydf = pd.DataFrame.from_records(record)
>>> mydf.dtypes
a    float64
b      int64
dtype: object

答案 3 :(得分:0)

在处理数据类型时,应将它们作为字符串传递。

例如,您遵循的后一种方法应修改为

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **'int'**})

代替

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **int**})

dtype (int, float etc.)应该以字符串形式给出。

或者作为替代方法(如果您不想作为字符串传递) 将numpy导入为np 并使用 mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **np.int**})