Regex 将包含括号的字符串替换为括号中的浮点
我有一个数据集,其中有一列字符串,我想将其转换为浮点数。但是,该列只有一个条目,其中包含括号内的数字(表示为负数)。我尝试了不同的方法——间接和直接——用一种表示法替换该值,使我能够将其转换为float,但我一直失败,我不明白为什么: 以下是括号下数字为字符串的行: 我的代码:Regex 将包含括号的字符串替换为括号中的浮点,regex,python-3.x,pandas,replace,Regex,Python 3.x,Pandas,Replace,我有一个数据集,其中有一列字符串,我想将其转换为浮点数。但是,该列只有一个条目,其中包含括号内的数字(表示为负数)。我尝试了不同的方法——间接和直接——用一种表示法替换该值,使我能够将其转换为float,但我一直失败,我不明白为什么: 以下是括号下数字为字符串的行: 我的代码: mask1 = purchases.Amount.str.contains('\(').fillna(False) purchases.loc[mask1, :]['Amount'] = purchases.loc[
mask1 = purchases.Amount.str.contains('\(').fillna(False)
purchases.loc[mask1, :]['Amount'] = purchases.loc[mask1, :]['Amount'].str.replace('\(', '-').str.replace('\)', '')
purchases.loc[mask2, :]['Amount'] = purchases.loc[mask2, :]['Amount'].str.replace('\s+', '').str.replace('[a-z]+', '')
# Both fail to replace
purchases.loc[mask1, :]['Amount'] = '-29.99' # direct assignment also fails
结果是:
我做错了什么?如何更正它?您可以尝试:
df = pd.DataFrame({'Amount': ['(29.29)', '29.29']})
print(df)
df['Amount']=df.Amount.apply(lambda x: -float(x[1:-1]) if x[0] == '(' else float(x))
print(df)
print(df.dtypes)
结果:
Amount
0 (29.29)
1 29.29
Amount
0 -29.29
1 29.29
Amount float64
dtype: object
为什么不检查字符串是否被括号包围,如果是,则将其去掉
from decimal import Decimal
def get_amount(s):
if s[0] == '(' and s[-1] == ')':
return Decimal(s[1:-1])
else:
return Decimal(s)
使用
rstrip
删除最后一个)
,然后替换(
和最后一个转换为浮点数:
df = pd.DataFrame({'Amount': ['(29.29)', '(39.39)', '12.5', '340']})
df['Amount'] = df['Amount'].str.strip(')').str.replace('\(', '-').astype(float)
print (df)
Amount
0 -29.29
1 -39.39
2 12.50
3 340.00
您的解决方案非常接近,您需要的是,仅使用列名称为F的loc
,以避免:
mask1 = purchases.Amount.str.contains('\(').fillna(False)
purchases.loc[mask1, 'Amount'] = purchases.loc[mask1, 'Amount'].str.replace('\(', '-').str.replace('\)', '')
purchases.loc[mask2, 'Amount'] = purchases.loc[mask2, 'Amount'].str.replace('\s+', '').str.replace('[a-z]+', '')
purchases.loc[mask1, 'Amount'] = '-29.99'