如何将pandas dataframe列转换为原生python数据类型?

jhiyze9q  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(97)

我有一个dataframe,它的columns数据类型需要Map到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也是如此

更新:

大多数评论都质疑这样做是否明智。networkx读取dataframes并接受np datatypes。但是,由于以下有据可查的错误,无法使用json_dumps写入该图:TypeError: Object of type 'int64' is not JSON serializable
谢谢

eoigrqb6

eoigrqb61#

pandas(或numpy)的“原生Python类型”是一个对象。这就是它的程度。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'>
t9eec4r0

t9eec4r02#

Pandas和扩展的Dataframe都是基于numpy构建的,所以你不能选择存储的特定类型。最好的办法是使用to_dict,然后将其用作poor-mans Dataframe 。你为什么要这么做

ni65a41a

ni65a41a3#

使用numpy tolist

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

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

相关问题