如何在pandas DataFrame中按列设置dtypes

Chr*_*ris 34 python types pandas

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

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

结果是:

TypeError:数据类型未被理解

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

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

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

如果我把dtype=(float,int)它应用浮动格式到两列.

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

mat*_*exx 16

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

for k, v in dtype.items():
    df[k] = df[k].astype(v)
Run Code Online (Sandbox Code Playgroud)

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

供参考:

  • 我需要使用`for k,v in dtype.iteritems():`for this to work. (3认同)
  • 这可以改为`df.astype(dtype)` (3认同)

DBC*_*igo 8

您可能想尝试将Series对象字典传递给DataFrame构造函数 - 它会让您对创建进行更具体的控制,并且希望应该更清楚发生了什么。模板版本(data1可以是数组等):

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

和数据示例:

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


use*_*424 7

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

dtype : dtype, default None

    Data type to force. Only a single dtype is allowed. If None, infer
Run Code Online (Sandbox Code Playgroud)

但是,数据帧类确实有一个静态方法,允许您将 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
Run Code Online (Sandbox Code Playgroud)