Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将混合类型转换为字符串_Python_Pandas_Types - Fatal编程技术网

Python 将混合类型转换为字符串

Python 将混合类型转换为字符串,python,pandas,types,Python,Pandas,Types,给定以下数据帧: DF = pd.DataFrame({'COL1': ['A', 'B', 'C', 'D','D','D'], 'mixed': [2016.0, 2017.0, 'sweatervest', 20, 209, 21]}) DF COL1 mixed 0 A 2016.0 1 B 2017.0 2 C sweatervest 3 D 20 4 D 209 5 D

给定以下数据帧:

DF = pd.DataFrame({'COL1': ['A', 'B', 'C', 'D','D','D'], 
'mixed': [2016.0, 2017.0, 'sweatervest', 20, 209, 21]})
DF

    COL1    mixed
0   A       2016.0
1   B       2017.0
2   C       sweatervest
3   D       20
4   D       209 
5   D       21
我想将“mixed”转换为一个对象,这样所有的数字都是字符串形式的整数,当然,所有的字符串都是字符串。 所需的输出如下:

    COL1    mixed
0   A       2016
1   B       2017
2   C       sweatervest
3   D       20
4   D       209 
5   D       21
背景资料:

最初,“混合”是从CSV中提取的数据帧的一部分,该CSV主要由数字组成,并带有一些字符串。当我尝试将其转换为字符串时,一些数字的结尾以“.0”结尾。

尝试:

DF['mixed']=DF.mixed.astype(object)
这导致:

DF['mixed']

0           2016
1           2017
2    sweatervest
3             20
4            209
5             21
Name: mixed, dtype: object

df.mixed=df.mixed.apply(lambda elt:str(int(elt))如果isinstance(elt,float)else str(elt))

这将在'mixed'列的每个元素上调用
lambda elt:str(int(elt))if isinstance(elt,float)else str(elt)
函数


注意:这假设您的所有浮点数都可以转换为整数,正如您在对问题的评论中所暗示的那样。

此方法以gbrener的答案为基础。它在日期框上迭代,查找混合的数据类型列。对于每个这样的混合列,它首先将所有
nan
值替换为
pd.NA
。然后它安全地将其值转换为字符串。它可用作unmix\U数据类型(df)。在Python 3.8下使用Pandas 1对其进行了测试

注意,这个答案使用的是仅适用于Python3.8或更新版本的。但是,可以对其进行细微的修改,使其不使用它们

从键入import Union开始
作为pd进口熊猫
def_to_str(val:Union[type(pd.NA),float,int,str])->Union[type(pd.NA),str]:
“”“返回给定整数、四舍五入浮点或其他字符串的字符串表示形式。”。
`pd.NA`值按原样返回。
在调用此函数之前,调用'df[col].fillna(value=pd.NA,inplace=True)`可能很有用。
"""
如果val为pd.NA:
返回值
如果isinstance(val,float)和(val%1==0.0):
返回str(int(val))
如果isinstance(val,int):
返回str(val)
断言isinstance(val,str)
返回值
def unmix_数据类型(df:pd.DataFrame)->无:
“”“将给定数据帧中的混合数据类型列转换为字符串。
裁判:https://stackoverflow.com/a/61826020/
"""
对于df.列中的列:
如果不是(orig_dtype:=pd.api.types.infere_dtype(df[col])).startswith(“混合”):
持续
df[col].fillna(值=pd.NA,inplace=True)
df[col]=df[col]。应用(_到_str)
if(new_dtype:=pd.api.types.infere_dtype(df[col]).startswith(“mixed”):
raise TypeError(f“无法将{col}转换为非混合数据类型。其以前的数据类型为{orig\U dtype},新的数据类型为{new\U dtype}”。)

注意:但是,不指定显式数据类型的危险之一是
[“012”、“0034”、“4”]
等列可以被
pd读取。将csv
作为整数列读取,从而不可恢复地丢失前导零。更糟糕的是,如果数据帧被串联,前导零的丢失可能会不一致地发生,导致列值,例如[“012”、“12”、“34”、“0034”]。

原始数据的数字结尾处带有
.0
。它们是
float
s。你想先把它们转换成
int
s吗?我想是的。在我使用的CSV文件中,没有这样的小数。在我通过astype(str)将它们转换成字符串后,它们才得到小数。因此,如果这更容易的话,也许我应该从这一步开始。否则,我想首先将数值转换为浮点数。看起来有些是用小数读取的,有些不是。所以我认为我需要:将浮点转换为整数,然后转换为字符串,将整数转换为字符串,并将字符串保留为字符串…但我不知道如何转换。我这样做的主要原因是能够连接数据文件,目前,似乎一个表的键字段的格式与另一个不同,我猜这就是为什么要连接(pd.merge)这是失败的。我将尝试使用字符串整数来对抗科学符号(见下面的注释),看看它是否有效。@DanceParty。我遇到了与您描述的类似的问题(混合类型的csv文件)。它帮助将
low\u memory=False
设置为
read\u csv()
的参数。如果我不这样做,浮点(作为字符串)将被读取,即使csv文件中实际上不存在小数点(只有与其他字符串混合的整数值,但有许多(>10k)行)。我只是尝试了这个。它将十进制数字保留为科学记数法。然而,连接起作用了,所以就我而言,这解决了问题。谢谢你们两位。顺便问一下……使用DF['mixed']=DF.mixed.astype(object)和DF.mixed=DF.mixed.astype(object)有什么区别?没有区别,尽管是否可以使用点符号取决于系列的标签。例如,如果您的字段名中有空格。我尝试了此操作,但出现了以下错误:ValueError:无法将浮点NaN转换为整数如果要找出问题的原因,请将
lambda
分解为单独的函数(用
def
定义)并使用一些打印语句在表达式周围添加一个try-except块。