将带有逗号和尾随减号的字符串格式的金额转换为数字或浮点数
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
我有一个字符串格式的数值列,带有千位分隔符逗号和在字符串末尾声明的负号以表示负值。
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并转换为浮点数
如果初始字符串以'-'
输出:
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