首页 > 解决方案 > 使用“object”类型的 numpy 数组创建混合类型的 Pandas 数据框

问题描述

我有一个混合数据类型(float64 和字符串)的 pandas 数据框,要在 sklearn 管道中使用它,我需要将其转换为 numpy 数组。在管道的最后,我想再次制作一个 Dataframe。

问题是,在创建具有混合类型的 numpy 数组时,所有数据都将转换为 dtype “object”。这样,当我最后创建一个新数据框时,所有数据都是分类的。

例子:

具有混合数据的数据框

>>> dataframe = pd.DataFrame([[1,2,3],["a","b","c"]], columns = ["num", "cat"])

>>> dataframe.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   num     3 non-null      int64 
 1   cat     3 non-null      object
dtypes: int64(1), object(1)
memory usage: 176.0+ bytes

到 numpy 数组

>>> array = dataframe.to_numpy()

array([[1, 'a'],
       [2, 'b'],
       [3, 'c']], dtype=object)

返回数据框

>>> new_df = pd.DataFrame(array, columns = ["num", "cat"])

>>> new_df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   num     3 non-null      object
 1   cat     3 non-null      object
dtypes: object(2)
memory usage: 176.0+ bytes

现在这两列是分类的。

有没有办法让 pandas 识别 numpy 数组中的真实数据类型?

标签: pythonarrayspandasnumpydataframe

解决方案


如果您使用的是 pandas >= 1.0,则有convert_dtypes

>>> new_df = pd.DataFrame(array, columns = ["num", "cat"]).convert_dtypes()
>>> new_df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   num     3 non-null      Int64 
 1   cat     3 non-null      string
dtypes: Int64(1), string(1)
memory usage: 179.0 bytes

推荐阅读