我有一个数据集,其中包含一列要转换为浮点数的字符串。但是,该列只有一个条目,在括号中包含一个数字(表示为负数)。我尝试了不同的方式(间接和直接),用一种表示形式替换该值,该表示形式使我能够将其转换为浮点型,但是我一直失败,而且我不明白为什么:
以下是带有括号的数字作为字符串的行:
我的代码:
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
结果:
我在做什么错?我该如何纠正?
答案 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)