Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
Regex 将包含括号的字符串替换为括号中的浮点_Regex_Python 3.x_Pandas_Replace - Fatal编程技术网

Regex 将包含括号的字符串替换为括号中的浮点

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[

我有一个数据集,其中有一列字符串,我想将其转换为浮点数。但是,该列只有一个条目,其中包含括号内的数字(表示为负数)。我尝试了不同的方法——间接和直接——用一种表示法替换该值,使我能够将其转换为float,但我一直失败,我不明白为什么:

以下是括号下数字为字符串的行:

我的代码:

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'