如何在pandas DataFrame中按列设置dtypes

camsedfj  于 2023-05-12  发布在  其他
关注(0)|答案(5)|浏览(174)

我想把一些数据带入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),它将对两列应用浮点格式。
最后,我希望能够传递给它一个数据类型列表,就像我传递给它一个列名列表一样。

3qpi33ja

3qpi33ja1#

我刚刚遇到了这个问题,Pandas的问题仍然是开放的,所以我张贴我的解决办法。假设df是我的DataFrame,dtype是一个将列名Map到类型的dict:

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

(note:在python中使用dtype.iteritems() 2)
供参考:

x33g5p2x

x33g5p2x2#

您可能想尝试将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
t3psigkw

t3psigkw3#

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

qzwqbdag4#

在Pandas 1.5.3版本中,可以传递显式数据类型:

import pandas as pd
data = (['Alex', 10],["Bob",12],["Clarke",11.05])
df = pd.DataFrame(data,columns=("Name", "Age"),dtype=(str, float))
print(df)
vsdwdz23

vsdwdz235#

在使用数据类型时,它们应该作为字符串传递。
例如,后面的方法应该修改为
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': 'int'})
而不是
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})
dtype (int, float etc.)应该作为字符串给出。
或者作为替代方法(如果你不想作为字符串传递)import numpy as np并使用mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': np.int})

相关问题