【问题标题】:How to preserve datatype in DataFrame from an sklearn Transform (Imputer)如何从 sklearn 转换 (Imputer) 中保留 DataFrame 中的数据类型
【发布时间】:2019-08-03 12:49:43
【问题描述】:

我有以下数据。

+----+-------------+----------+--------+------+-------+-------+---------+
| ID | PassengerId | Survived | Pclass | Age  | SibSp | Parch |  Fare   |
+----+-------------+----------+--------+------+-------+-------+---------+
|  0 |           1 |        0 |      3 | 22.0 |     1 |     0 | 7.2500  |
|  1 |           2 |        1 |      1 | 38.0 |     1 |     0 | 71.2833 |
|  2 |           3 |        1 |      3 | 26.0 |     0 |     0 | 7.9250  |
|  3 |           4 |        1 |      1 | 35.0 |     1 |     0 | 53.1000 |
|  4 |           5 |        0 |      3 | 35.0 |     0 |     0 | 8.0500  |
|  5 |           6 |        0 |      3 | NaN  |     0 |     0 | 8.4583  |
+----+-------------+----------+--------+------+-------+-------+---------+

转换后(通过插补)数据类型假设从 int/bool 变为浮点数。

+----+-------------+----------+--------+-----------+-------+-------+---------+
| ID | PassengerId | Survived | Pclass |    Age    | SibSp | Parch |  Fare   |
+----+-------------+----------+--------+-----------+-------+-------+---------+
|  0 | 1.0         | 0.0      | 3.0    | 22.000000 | 1.0   | 0.0   | 7.2500  |
|  1 | 2.0         | 1.0      | 1.0    | 38.000000 | 1.0   | 0.0   | 71.2833 |
|  2 | 3.0         | 1.0      | 3.0    | 26.000000 | 0.0   | 0.0   | 7.9250  |
|  3 | 4.0         | 1.0      | 1.0    | 35.000000 | 1.0   | 0.0   | 53.1000 |
|  4 | 5.0         | 0.0      | 3.0    | 35.000000 | 0.0   | 0.0   | 8.0500  |
|  5 | 6.0         | 0.0      | 3.0    | 28.000000 | 0.0   | 0.0   | 8.4583  |
+----+-------------+----------+--------+-----------+-------+-------+---------+

我的代码如下:

import pandas as pd
import numpy as np

#https://www.kaggle.com/shivamp629/traincsv/downloads/traincsv.zip/1
data = pd.read_csv("train.csv")

data2 = data[['PassengerId', 'Survived','Pclass','Age','SibSp','Parch','Fare']].copy()

from sklearn.preprocessing import Imputer

fill_NaN = Imputer(missing_values=np.nan, strategy='median', axis=0)
data2_im = pd.DataFrame(fill_NaN.fit_transform(data2), columns = data2.columns)

data2_im

有没有办法保留数据类型?感谢您的帮助。

【问题讨论】:

    标签: python pandas numpy scikit-learn


    【解决方案1】:

    dtypes 无法保留,因为 sklearn 在转换之前从 data2 中提取基础数据,并且出于性能原因将 dtypes 同质化为浮动。

    您始终可以使用astype 恢复初始数据类型:

    v = fill_NaN.fit_transform(data2)
    df = pd.DataFrame(v, columns=data2.columns).astype(data2.dtypes.to_dict())
    df
    
       PassengerId  Survived  Pclass   Age  SibSp  Parch     Fare
    0            1         0       3  22.0      1      0   7.2500
    1            2         1       1  38.0      1      0  71.2833
    2            3         1       3  26.0      0      0   7.9250
    3            4         1       1  35.0      1      0  53.1000
    4            5         0       3  35.0      0      0   8.0500
    5            6         0       3  35.0      0      0   8.4583
    

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 2020-03-13
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2020-04-30
      • 2022-01-17
      相关资源
      最近更新 更多