如何将 pandas 数据框列转换为本机 python 数据类型?

Posted

技术标签:

【中文标题】如何将 pandas 数据框列转换为本机 python 数据类型?【英文标题】:How to convert pandas dataframe columns to native python data types? 【发布时间】:2018-05-05 13:20:51 【问题描述】:

我有一个数据框,其列数据类型需要映射到 python 本机数据类型。

我希望能够从 numpy 获取字典并将每一列转换为它的本机类型。

例如:

numpy.object_: object,
 numpy.bool_: bool,
 numpy.string_: str,
 numpy.unicode_: unicode,
 numpy.int64: int,
 numpy.float64: float,
 numpy.complex128: complex

astypepd.to_numeric 我都试过了,都没有充分地向下转换列。

df['source'] = df['source'].astype(int) 返回int32pd.to_numeric 也是如此

更新:

大多数 cmets 质疑这样做是否明智。 networkx 读取 dataframes 并接受 np datatypes。然而,由于这个有据可查的错误,无法使用json_dumps 编写图表:TypeError: Object of type 'int64' is not JSON serializable

谢谢

【问题讨论】:

不,你不能。你为什么要?将它们作为 numpy 类型处理要快得多。 对于 numpy 数组,tolist()item()(对于一个元素)是获取列表或原生 Python 对象的最佳方式。 astype 只是改变数组dtype 【参考方案1】:

Pandas 和扩展的 Dataframes 是基于 numpy 构建的,因此您无需选择它们存储的特定类型。您最好的选择是使用to_dict,然后将其用作穷人数据框。为什么要这样做?

【讨论】:

【参考方案2】:

pandas(或numpy)的“Native Python type”是一个对象。这就是它的程度。 Pandas 只知道它是一个 Python 对象并采取相应的行动。除此之外,您不能有字符串、unicode、整数等类型的列。

不过,您可以拥有对象列并在其中存储您想要的任何内容。在此阶段,Pandas 将为您处理大部分转换。

df = pd.DataFrame('A': [1, 2], 
                   'B': [1., 2.], 
                   'C': [1 + 2j, 3 + 4j], 
                   'D': [True, False], 
                   'E': ['a', 'b'], 
                   'F': [b'a', b'b'])

df.dtypes
Out[71]: 
A         int64
B       float64
C    complex128
D          bool
E        object
F        object
dtype: object

for col in df:
    print(type(df.loc[0, col]))

<class 'numpy.int64'>
<class 'numpy.float64'>
<class 'numpy.complex128'>
<class 'numpy.bool_'>
<class 'str'>
<class 'bytes'>

df = df.astype('object')

for col in df:
    print(type(df.loc[0, col]))

<class 'int'>
<class 'float'>
<class 'complex'>
<class 'bool'>
<class 'str'>
<class 'bytes'>

【讨论】:

【参考方案3】:

使用 numpy 列表

(getattr(x, "tolist", lambda: x)() for x in df)

见https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tolist.html

【讨论】:

以上是关于如何将 pandas 数据框列转换为本机 python 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 数据框列标签从浮点数转换为整数

将所有数据框列转换为浮动的最快方法 - pandas astype 慢

将 pandas 数据框列从十六进制字符串转换为 int

python pandas数据框列转换为dict键和值

如何将数据框列转换为字符串并替换 nans(fillna 不起作用)

将多个火花数据框列转换为具有列表类型的单列