用熊猫中的浮点数替换包含括号的字符串

时间:2019-12-20 14:09:32

标签: regex python-3.x pandas replace

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

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

enter image description here

我的代码:

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

结果:

enter image description here

我在做什么错?我该如何纠正?

3 个答案:

答案 0 :(得分:2)

使用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

您的解决方案非常接近,您需要什么,仅将loc与namef列一起使用以避免chain indexing

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' 

答案 1 :(得分:0)

您可以尝试:

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

答案 2 :(得分:0)

为什么不只是检查字符串是否被方括号括起来,如果是,则将其剥离。

from decimal import Decimal

def get_amount(s):
    if s[0] == '(' and s[-1] == ')':
        return Decimal(s[1:-1])
    else:
        return Decimal(s)