gpt4 book ai didi

python - 更改 Pandas 的列类型

转载 作者:行者123 更新时间:2023-12-03 08:38:16 25 4
gpt4 key购买 nike

我想将表示为列表列表的表转换为Pandas DataFrame。作为一个极其简化的示例:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)

将列转换为适当类型的最佳方法是什么(在这种情况下,将列2和3转换为浮点数)?有没有一种方法可以在转换为DataFrame时指定类型?还是先创建DataFrame然后遍历各列以更改各列的类型更好?理想情况下,我想以动态方式执行此操作,因为可以有数百个列,并且我不想确切指定哪些列属于哪种类型。我可以保证的是,每一列都包含相同类型的值。

最佳答案

您可以通过四个主要选项来转换 Pandas 的类型:

  • to_numeric() -提供将非数字类型(例如字符串)安全地转换为合适的数字类型的功能。 (另请参见 to_datetime() to_timedelta() 。)
  • astype() -将(几乎)任何类型转换为(几乎)任何其他类型(即使这样做不一定明智)。还允许您转换为categorial类型(非常有用)。
  • infer_objects() -一种实用的方法,可以将保存Python对象的对象列转换为pandas类型。
  • convert_dtypes() -将DataFrame列转换为支持pd.NA( Pandas 对象表示缺失值)的“最佳可能” dtype。

  • 继续阅读以获取每种方法的更详细的解释和用法。

    1. to_numeric()将DataFrame的一列或多列转换为数值的最佳方法是使用 pandas.to_numeric()
    此函数将尝试将非数字对象(例如字符串)适当地更改为整数或浮点数。
    基本用法 to_numeric()的输入是Series或DataFrame的单个列。
    >>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
    >>> s
    0 8
    1 6
    2 7.5
    3 3
    4 0.9
    dtype: object

    >>> pd.to_numeric(s) # convert everything to float values
    0 8.0
    1 6.0
    2 7.5
    3 3.0
    4 0.9
    dtype: float64
    如您所见,将返回一个新的Series。请记住,将此输出分配给变量或列名以继续使用它:
    # convert Series
    my_series = pd.to_numeric(my_series)

    # convert column "a" of a DataFrame
    df["a"] = pd.to_numeric(df["a"])
    您还可以使用它通过 apply()方法来转换DataFrame的多个列:
    # convert all columns of DataFrame
    df = df.apply(pd.to_numeric) # convert all columns of DataFrame

    # convert just columns "a" and "b"
    df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
    只要您的值都可以转换,那可能就是您所需要的。
    错误处理
    但是,如果某些值不能转换为数字类型怎么办? to_numeric()还采用 errors关键字参数,该参数允许您将非数字值强制为 NaN,或仅忽略包含这些值的列。
    这是一个使用一系列具有对象dtype的字符串 s的示例:
    >>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
    >>> s
    0 1
    1 2
    2 4.7
    3 pandas
    4 10
    dtype: object
    如果无法转换值,则默认行为是引发。在这种情况下,它不能处理字符串“pandas”:
    >>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
    ValueError: Unable to parse string
    我们可能希望将“pandas”视为丢失/错误的数值,而不是失败。我们可以使用 NaN关键字参数将无效值强制为 errors:
    >>> pd.to_numeric(s, errors='coerce')
    0 1.0
    1 2.0
    2 4.7
    3 NaN
    4 10.0
    dtype: float64
    errors的第三个选项只是在遇到无效值时忽略该操作:
    >>> pd.to_numeric(s, errors='ignore')
    # the original Series is returned untouched
    当您要转换整个DataFrame,但又不知道我们哪些列可以可靠地转换为数字类型时,最后一个选项特别有用。在这种情况下,只需写:
    df.apply(pd.to_numeric, errors='ignore')
    该函数将应用于DataFrame的每一列。可以转换为数字类型的列将被转换,而不能转换(例如,它们包含非数字字符串或日期)的列将被保留。
    下垂
    默认情况下,使用 to_numeric()进行转换将为您提供 int64float64 dtype(或平台固有的任何整数宽度)。
    通常这就是您想要的,但是如果您想节省一些内存并使用更紧凑的dtype(例如 float32int8)怎么办? to_numeric()使您可以选择向下转换为'integer','signed','unsigned','float'。这是一个简单的整数类型 s系列的示例:
    >>> s = pd.Series([1, 2, -7])
    >>> s
    0 1
    1 2
    2 -7
    dtype: int64
    向下转换为“整数”将使用可以保存值的最小整数:
    >>> pd.to_numeric(s, downcast='integer')
    0 1
    1 2
    2 -7
    dtype: int8
    向下转换为“float”类似地选择了一个比普通浮点型小的类型:
    >>> pd.to_numeric(s, downcast='float')
    0 1.0
    1 2.0
    2 -7.0
    dtype: float32

    2. astype() astype() 方法使您可以明确表示希望DataFrame或Series具有的dtype。它非常通用,可以尝试从一种类型转换为另一种类型。
    基本用法
    只需选择一个类型即可:您可以使用NumPy dtype(例如 np.int16),某些Python类型(例如bool)或特定于 Pandas 的类型(例如类别dtype)。
    在要转换的对象上调用方法, astype()将尝试为您转换它:
    # convert all DataFrame columns to the int64 dtype
    df = df.astype(int)

    # convert column "a" to int64 dtype and "b" to complex type
    df = df.astype({"a": int, "b": complex})

    # convert Series to float16 type
    s = s.astype(np.float16)

    # convert Series to Python strings
    s = s.astype(str)

    # convert Series to categorical type - see docs for more details
    s = s.astype('category')
    注意,我说的是“尝试”-如果 astype()不知道如何转换Series或DataFrame中的值,它将引发错误。例如,如果您具有 NaNinf值,则在尝试将其转换为整数时会出错。
    从 Pandas 0.20.0开始,可以通过传递 errors='ignore'来抑制此错误。您的原始对象将保持原样返回。
    小心 astype()功能强大,但有时会“错误地”转换值。例如:
    >>> s = pd.Series([1, 2, -7])
    >>> s
    0 1
    1 2
    2 -7
    dtype: int64
    这些都是小整数,那么如何转换为无符号8位类型以节省内存呢?
    >>> s.astype(np.uint8)
    0 1
    1 2
    2 249
    dtype: uint8
    转换成功了,但-7被换成了249(即28-7)!
    尝试使用 pd.to_numeric(s, downcast='unsigned')向下转换可以帮助防止该错误。

    3. infer_objects()pandas的0.21.0版引入了 infer_objects() 方法,用于将具有对象数据类型的DataFrame列转换为更特定的类型(软转换)。
    例如,这是一个带有两列对象类型的DataFrame。一个保存实际的整数,另一个保存代表整数的字符串:
    >>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
    >>> df.dtypes
    a object
    b object
    dtype: object
    使用 infer_objects(),您可以将列“a”的类型更改为int64:
    >>> df = df.infer_objects()
    >>> df.dtypes
    a int64
    b object
    dtype: object
    由于列“b”的值是字符串而不是整数,因此已被保留。如果要尝试强制将两列都转换为整数类型,则可以改用 df.astype(int)

    4. convert_dtypes()1.0版及更高版本包括 convert_dtypes() 方法,用于将Series和DataFrame列转换为支持 pd.NA缺少值的最佳dtype。
    此处“最大可能”是指最适合保存值的类型。例如,如果所有值都是整数(或缺失值),则为pandas整数类型:Python整数对象的对象列将转换为 Int64,NumPy int32值的列将成为pandas dtype Int32
    使用 object DataFrame df,我们得到以下结果:
    >>> df.convert_dtypes().dtypes                                             
    a Int64
    b string
    dtype: object
    由于列'a'保留整数值,因此将其转换为 Int64类型(与 int64不同,它能够保留缺失值)。
    列“b”包含字符串对象,因此已更改为 Pandas 的 string dtype。
    默认情况下,此方法将从每列的对象值中推断类型。我们可以通过传递 infer_objects=False来改变它:
    >>> df.convert_dtypes(infer_objects=False).dtypes                          
    a object
    b string
    dtype: object
    现在列'a'仍然是对象列: Pandas 知道它可以描述为'整数'列(内部它运行 infer_dtype ),但是没有确切推断它应该具有的dtype的整数,因此没有转换它。列“b”再次被转换为“字符串” dtype,因为它被识别为持有“字符串”值。

    关于python - 更改 Pandas 的列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64587063/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com