Python 在执行数据帧操作之前,我可以转换数据类型吗?

Python 在执行数据帧操作之前,我可以转换数据类型吗?,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个包含多个数据类型的pandas数据帧,并且我想添加来自另一个可能具有其他类型的数据的数据。例如,在连接数据帧时,是否有一种简单的方法来转换类型或引发错误 将熊猫作为pd导入 old=pd.DataFrame({'one':[1,2,3],'two':[100200300]}).aType({'one':'int8','two':'Int16'}) new=pd.DataFrame({'one':['11'、'22'、'33']、'two':['110'、'220'、'330']})

假设我有一个包含多个数据类型的pandas数据帧,并且我想添加来自另一个可能具有其他类型的数据的数据。例如,在连接数据帧时,是否有一种简单的方法来转换类型或引发错误

将熊猫作为pd导入
old=pd.DataFrame({'one':[1,2,3],'two':[100200300]}).aType({'one':'int8','two':'Int16'})
new=pd.DataFrame({'one':['11'、'22'、'33']、'two':['110'、'220'、'330']})
(old.dtypes==new.dtypes).all()#False
#此时,一个普通的pd.concat([old,new])将导致
#两列。我想要像这样的东西
结果=强制_concat([旧的,新的])
(old.dtypes==result.dtypes).all()#True
(result.dtypes==new.dtypes).all()#False
#当无法强制类型时,它应该会引发错误
奇数=pd.DataFrame({'one':['eleventen','22','33'],'two':['110','220','330']))
结果=强制_concat([旧,奇])#错误

在读取文件或通过传递参数创建数据帧期间,有一种方法可以将每一列数据视为字符串类型
dtype=str

这会将空值的NaN更改为“NULL”

下面是一个代码片段,它将所有数据类型更改为字符串

df\u read=pd.read\u csv(savefile,dtype=str)

也许你可以通过这个类似的问题问。此外,这种行为在您使用的熊猫版本中变化不大。在较新版本中,代码片段可以正常工作

我在下面稍微修改了你的代码

import pandas as pd

old = pd.DataFrame({'one':[1,2,3],'two':[100,200,300]}, dtype=str)
new = pd.DataFrame({'one':['11','22','33'],'two':['110','220','330']}, dtype=str)

print((old.dtypes == new.dtypes).all()) # This will return True as all data types are string now
尝试:

现在,如果您打印
new.dtypes
,您将得到:

one     int8
two    int16
dtype: object

使用
astype()
方法:
pd.concat([new.astype(int),old])
new检查示例数据帧的数据类型
new.astype(dict(zip(new.columns,old.dtypes.values))
为我引发了一个错误。我不想要通用的
int
,我需要类型相同。谢谢您的输入!不幸的是,我有一个具有多种类型的数据帧,所以我不能在这里以这种方式使用
dtype
关键字。此外,您可以看到此处的
新建
框架已经具有
对象
类型。我的目标是保持原始数据帧不变,并转换新数据帧。@shortorian cool…我会被诅咒的。我没有想到pandas可以强制使用numpy整数,但不能强制使用pandas整数。您不能将
字符串直接转换为
'Int16'(pandas.Int8Dtype)
,但您可以将
'Int16'(numpy.int8)
直接转换为
'Int16'(pandas.Int8Dtype)
这非常有用,所以如果您想要完全相同的数据类型,那么首先执行
new=new.astype(dict(zip(new.columns,old.dtypes.astype(str.str.lower().values))
然后执行
new=new.astype(dict(zip(new.columns,old.dtypes.values))
one     int8
two    int16
dtype: object