Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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或Pandas将数据帧中的字符串货币数字转换为浮点_Python_Regex_Pandas - Fatal编程技术网

使用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(即您的元素)是字符串。它不是来自任何特殊的库。@abutemutate
    df['last_-revenues']=df['last_-revenues'].apply(lambda rstr:float(rstr.replace('.','','').replace(','.'')[3:]如果rstr!='nan应该有效。
    实际上这是得到了以下错误:AttributeError在我的计算机上尝试时,'float'对象没有属性'replace'。not。可能您的参考底图数据已经是浮动的,因此这只是表示问题,而不是实际转换?是否从特定库中替换?
    。替换()
    是字符串方法。因此,它假定rstr(即您的元素)是字符串。它不是来自任何特殊的库。@abutemutate
    df['last\u revenues']=df['last\u revenues'].apply(lambda rstr:float(rstr.replace('.','','')。如果rstr!='nan',则替换(','.')[3:])
    应该有效