pandas python dataframe自动将数字列转换为float,但不删除非数字列

bwitn5fc  于 2023-08-01  发布在  Python
关注(0)|答案(2)|浏览(136)

我创建了以下函数来获取数据框,将数字列d类型转换为数字。这是做得很好,但问题是,它也放弃了非数字列,我不想。因为,这些列也携带一些重要的信息。

def convert_dataframe_to_numeric_type(df):
    def is_it_a_number(x):
      try:
        float(x)
        return True
      except:
        return False
    df = df[df.applymap(is_it_a_number)]
    df = df.dropna(how='all',axis=1)
    # after converting all non-numeric elements, transform them to numeric
    df = df.transform(pd.to_numeric,errors='ignore')
    return df

字符串

whlutmcx

whlutmcx1#

尝试转换为数字并检查是否为空值将不起作用。几乎所有的数据文件都缺少数值,这些数值将显示为NA。像read_csv这样的数据加载函数将为每个空字段 * 和 * 公共NaN标记生成NA
默认情况下,以下值被解释为NaN:''、'#N/A'、'#N/A N/A'、'#NA'、'-1.#IND'、'-1.#QNAN'、'-NaN'、'-nan'、' 1.#IND'、'1.#QNAN'、''N/A'、' NA'、'NULL'、' NaN'、'None'、'n/a'、' nan'、'null'。
此外,尝试转换一个系列中的所有值,然后 * 检查是否有失败的结果会执行相同的工作 * 两次 *。Pandas有内置的方法来检测/转换类型,如果转换失败,这些类型将立即停止。
一个选项是infer_object,它尝试检测任何object系列的类型。另一个选项是convert_dtypes,它将尝试找到值的最佳类型。
使用这个dataframe,其中所有内容都是object

df = pd.DataFrame(
    {
        "a": pd.Series([1, 2, 3], dtype=np.dtype("O")),
        "b": pd.Series(["x", "y", "z"], dtype=np.dtype("O")),
        "c": pd.Series([True, False, np.nan], dtype=np.dtype("O")),
        "d": pd.Series(["h", "i", np.nan], dtype=np.dtype("O")),
        "e": pd.Series([10, np.nan, 20], dtype=np.dtype("O")),
        "f": pd.Series([np.nan, 100.5, 200], dtype=np.dtype("O")),
    }
)

字符串
infer_objects()生成以下类型:

df_i=df.infer_objects()
df_i.dtypes
-----------------------
a      int64
b     object
c     object
d     object
e    float64
f    float64
dtype: object


convert_dtypes更深入:

df_c=df.convert_dtypes()
df_c.dtypes
------------------------
a      Int64
b     string
c    boolean
d     string
e      Int64
f    Float64

8nuwlpux

8nuwlpux2#

您给出的函数似乎将is_it_a_number函数应用于数据框中的每个单元格,有效地丢弃了任何非数字单元格。这就是丢失不包含数字的列的原因。
您应该检查每一列,以确定它是否可以转换为数字格式,而不是验证每个单元格的数字属性。要实现这一点,您可以使用pd.to_numeric()函数,并附带errors='coerce'参数。这将在给定Series中将所有非数值值与NaN交换。转换完成后,如果结果列不只包含NaN,则保留转换后的列。如果所有值都是NaN,则使用原始列。
下面是函数的调整版本:

def convert_dataframe_to_numeric_type(df):
    for col in df.columns:
        df_numeric = pd.to_numeric(df[col], errors='coerce')
        if not df_numeric.isna().all():  # if not all values are NaN
            df[col] = df_numeric
    return df

字符串

相关问题