【问题标题】:Converting non numeric columns to numeric columns [duplicate]将非数字列转换为数字列[重复]
【发布时间】:2021-05-25 00:12:27
【问题描述】:

我的进口是:

import pandas as pd
import numpy as np
from pandas.api.types import is_numeric_dtype

我创建了一个 pandas 数据框(名为 df),如下所示:

   state  initial_temp     final_temp
0   Cold    48.0              88.1
1   hot     80.7              30.0
2   hot    140.2              25.0
3   hot     59.8              25.0
4   hot     80.0              25.0

所有列都有 dtypes 对象,但是,唯一应该具有该 dtype 的列是 state 列。我正在尝试将所有实际数字列(初始和最终温度)转换为数字 dtypes 并忽略/省略状态列。这主要用于教学目的。

我目前的尝试是:

def datatype_converter(df):
    col_list = []
    for column in df.columns:
        col_list.append(column)
        for i in range(len(col_list)):
            if is_numeric_dtype(df[col_list.pop()]):
                df.apply(pd.to_numeric, errors = 'coerce') # coerce invalid values to nan. 
            else:
                pass
    return df

【问题讨论】:

    标签: python python-3.x pandas dataframe numpy


    【解决方案1】:

    你可以的

    df.transform(pd.to_numeric, errors = 'ignore')
    

    【讨论】:

    • 非常感谢!这有助于提高我的编程技能。然而,这并不是我真正想要的。我试图通过假设状态列可能没有一致的名称来解决这个问题,只是它的内容是“热”或“冷”。因此,我正在尝试“自动化”这个过程。
    • @Caesar 检查编辑
    【解决方案2】:

    您在适当的列上使用astype,如下所示:

    df[["initial_temp", "final_temp"]] = df[["initial_temp", "final_temp"]].astype(float)
    

    df 是您的 DataFrame。当然,这是假设这些列中的所有值都是数字的。

    【讨论】:

    • 这行得通,但是,它并不是我真正想要的。我试图假设我不知道有多少列。因此,我正在尝试使流程自动化。
    【解决方案3】:

    这看起来非常复杂。怎么样

    target_cols = [col for col in df.columns if 
        is_numeric_dtype(df[col])
    ]
    for col in target_cols:
        df.loc[:, col] = pd.to_numeric(df[col])
    

    我确信有一种更精明的方法可以将其简化为一个语句并避免迭代列(改为应用布尔掩码),但这是可读且简洁的。

    【讨论】:

    • 非常感谢!这有助于提高我的编程技能。但是,它似乎并不能解决问题。所有的列仍然是对象。有什么我遗漏/不理解的地方吗?
    • 它对我来说很好,将(在您的示例中)initial_temp 和 final_temp 转换为 float64 dtype。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多