使用Python或Pandas将数据帧中的字符串货币数字转换为浮点
我有这个数据框:使用Python或Pandas将数据帧中的字符串货币数字转换为浮点,python,regex,pandas,Python,Regex,Pandas,我有这个数据框: df: CNPJ last_revenues 0 01.637.895/0001-32 R$ 12.696.658 1 02.916.265/0001-60 R$ 162.914.526,04 2 02.932.074/0001-91 R$ 1.928.312 3 03.853.896/0001-40 R$ 19.333.453,92 “上次收入”列中的值是
df:
CNPJ last_revenues
0 01.637.895/0001-32 R$ 12.696.658
1 02.916.265/0001-60 R$ 162.914.526,04
2 02.932.074/0001-91 R$ 1.928.312
3 03.853.896/0001-40 R$ 19.333.453,92
“上次收入”列中的值是拉丁格式的货币值字符串。我需要把它们变成浮子,它必须是这样的:
df:
CNPJ last_revenues
0 01.637.895/0001-32 12696658.0000
1 02.916.265/0001-60 162914526.0400
2 02.932.074/0001-91 1928312.0000
3 03.853.896/0001-40 19333453.9200
df:
CNPJ last_revenues
0 01.637.895/0001-32 R$ 12.696.658
1 02.916.265/0001-60 R$ 162.914.526,04
2 02.932.074/0001-91 nan
3 03.853.896/0001-40 R$ 19.333.453,92
df:
CNPJ last_revenues
0 01.637.895/0001-32 12696658.0000
1 02.916.265/0001-60 162914526.0400
2 02.932.074/0001-91 nan
3 03.853.896/0001-40 19333453.9200
编辑
事实上,我注意到中间有几个人。因此,我的df如下所示:
df:
CNPJ last_revenues
0 01.637.895/0001-32 12696658.0000
1 02.916.265/0001-60 162914526.0400
2 02.932.074/0001-91 1928312.0000
3 03.853.896/0001-40 19333453.9200
df:
CNPJ last_revenues
0 01.637.895/0001-32 R$ 12.696.658
1 02.916.265/0001-60 R$ 162.914.526,04
2 02.932.074/0001-91 nan
3 03.853.896/0001-40 R$ 19.333.453,92
df:
CNPJ last_revenues
0 01.637.895/0001-32 12696658.0000
1 02.916.265/0001-60 162914526.0400
2 02.932.074/0001-91 nan
3 03.853.896/0001-40 19333453.9200
我想让它看起来像这样:
df:
CNPJ last_revenues
0 01.637.895/0001-32 12696658.0000
1 02.916.265/0001-60 162914526.0400
2 02.932.074/0001-91 1928312.0000
3 03.853.896/0001-40 19333453.9200
df:
CNPJ last_revenues
0 01.637.895/0001-32 R$ 12.696.658
1 02.916.265/0001-60 R$ 162.914.526,04
2 02.932.074/0001-91 nan
3 03.853.896/0001-40 R$ 19.333.453,92
df:
CNPJ last_revenues
0 01.637.895/0001-32 12696658.0000
1 02.916.265/0001-60 162914526.0400
2 02.932.074/0001-91 nan
3 03.853.896/0001-40 19333453.9200
一种方法是
对最后一次收入
中的每个元素应用一个转换函数。这可以通过多种方式完成,但作为一个lambda
1行程序,它可以写成:
df['last_revenues'] = df['last_revenues'].dropna().apply(lambda rstr: float(rstr.replace('.','').replace(',','.')[3:]))
在这里,我首先删除所有nan值,然后用零替换所有点,然后用点替换逗号。最后,我删除了最初的货币字符,并将结果字符串转换为浮点。一种方法是对last\u revenues
中的每个元素应用一个转换函数。这可以通过多种方式完成,但作为一个lambda
1行程序,它可以写成:
df['last_revenues'] = df['last_revenues'].dropna().apply(lambda rstr: float(rstr.replace('.','').replace(',','.')[3:]))
在这里,我首先删除所有nan值,然后用零替换所有点,然后用点替换逗号。最后,我删除了最初的货币字符,并将结果字符串转换为浮点数。需要做两件事:
检测nan
修剪主要货币(用空格分隔)(rstr.split(“”)[1]
)
将货币字符串转换为int
df['last_revenues'] = df['last_revenues'].apply(lambda rstr: '{:5.4f}'.format(float(rstr.split(' ')[1].replace('.','').replace(',', '.'))) if rstr != 'nan' else 'nan')
需要做两件事:
检测nan
修剪主要货币(用空格分隔)(rstr.split(“”)[1]
)
将货币字符串转换为int
df['last_revenues'] = df['last_revenues'].apply(lambda rstr: '{:5.4f}'.format(float(rstr.split(' ')[1].replace('.','').replace(',', '.'))) if rstr != 'nan' else 'nan')
您也可以尝试:
df.last_revenues.replace('R\$ ','',inplace=True,regex=True)
df.last_revenues.replace('\.','',inplace=True,regex=True)
df.last_revenues.replace(',','.',inplace=True,regex=True)
您也可以尝试:
df.last_revenues.replace('R\$ ','',inplace=True,regex=True)
df.last_revenues.replace('\.','',inplace=True,regex=True)
df.last_revenues.replace(',','.',inplace=True,regex=True)
实际上,这是得到以下错误:AttributeError:“float”对象没有属性“replace”,在我的计算机上尝试时没有。可能您的参考底图数据已经是浮动的,因此这只是表示问题,而不是实际转换?是否从特定库中替换?。替换()
是字符串方法。因此,它假定rstr(即您的元素)是字符串。它不是来自任何特殊的库。@abutemutatedf['last_-revenues']=df['last_-revenues'].apply(lambda rstr:float(rstr.replace('.','','').replace(','.'')[3:]如果rstr!='nan应该有效。
实际上这是得到了以下错误:AttributeError在我的计算机上尝试时,'float'对象没有属性'replace'。not。可能您的参考底图数据已经是浮动的,因此这只是表示问题,而不是实际转换?是否从特定库中替换?。替换()
是字符串方法。因此,它假定rstr(即您的元素)是字符串。它不是来自任何特殊的库。@abutemutatedf['last\u revenues']=df['last\u revenues'].apply(lambda rstr:float(rstr.replace('.','','')。如果rstr!='nan',则替换(','.')[3:])
应该有效