如何在pandas数据框架中按列设置数据类型

2024-04-20 09:04:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在pandas数据框中引入一些数据,并且在导入时为每一列分配数据类型。我希望能够对具有许多不同列的较大数据集执行此操作,但作为示例:

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

结果:

TypeError: data type not understood

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

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

TypeError: object of type 'type' has no len()

如果我放置dtype=(float,int),它将对两列应用浮点格式。

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


Tags: columns数据示例dataframepandas列表typefloat
3条回答

我刚刚碰到这个问题,熊猫的问题还没有解决,所以我正在发布我的解决方案。假设df是我的数据帧,dtype是将列名映射到类型的dict:

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

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

供参考:

您可能希望尝试将对象的字典传递给Series构造函数-它将为您提供对创建的更具体的控制,并希望更清楚地了解发生了什么。模板版本(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

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

dtype : dtype, default None

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

但是,dataframe类确实有一个静态方法,允许您将numpy结构数组转换为dataframe,这样您就可以:

>>> 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

相关问题 更多 >