将带有逗号和尾随减号的字符串格式的金额转换为数字或浮点数

Convert amounts in string format with commas and trailing minus mark to numeric or float

我有一个字符串格式的数值列,带有千位分隔符逗号和在字符串末尾声明的负号以表示负值。

df1 = pd.DataFrame({'Name':['John', 'Tom', 'Simon', 'Jose','Jose'],
                     'Amount':['1,000.00','1,000.00-', '100.00', '100.00-','1,000,000.00-'],
                     'ExpectedAmount':[1000.00,-1000.00, 100.00, -100.00,-1000000.00],
                    })

我想将“金额”列中的值转换为浮点数,同时保留该值是正负值。

我可以使用“替换”删除逗号

df1['Amount1'] = df1['Amount'].str.replace(',','')

但是我无法将减号的位置从字符串的末尾更改为字符串的开头,以便将格式从字符串更改为浮点数。 有人可以帮我做这个吗?

您可以将减号替换为
df1.Amount.apply(lambda x: '-' + x[:-1] if x[-1] == '-' else x)

这是一个矢量解:

df1['ExpectedAmount'] = (df1['Amount'].str.replace('[^\d.]', '', regex=True).astype(float)
                        *df1['Amount'].str.endswith('-').mul(-2).add(1))

删除所有非digit/dot并转换为浮点数

如果初始字符串以'-'

结尾则乘以-1

输出:

    Name         Amount  ExpectedAmount
0   John       1,000.00          1000.0
1    Tom      1,000.00-         -1000.0
2  Simon         100.00           100.0
3   Jose        100.00-          -100.0
4   Jose  1,000,000.00-      -1000000.0

使用 Series.replace 交换 - 从后面到字符串的开头,删除 , 并转换为数字:

df1['Amount'] = (df1['Amount'].replace({r'(.*)(-)$': r'', ',':''}, regex=True)
                              .astype(float))
print (df1)
    Name     Amount  ExpectedAmount
0   John     1000.0          1000.0
1    Tom    -1000.0         -1000.0
2  Simon      100.0           100.0
3   Jose     -100.0          -100.0
4   Jose -1000000.0      -1000000.0