我有一个数据框,其中收入数据采用德语格式,€
类似
print(df['Revenue'])
0 23.979,12 €
1 7.993.137,63 €
2 418,83 €
Name: Revenue, dtype: object
有没有办法将其转换为
print(df['Revenue'])
0 23979.12
1 7993137.63
2 418.83
Name: Revenue, dtype: float
可以使用替换函数来完成,首先使用代码df.replace({'€':'', '\.':'',',':'.'}, regex=True,inplace=True)
以正确的格式转换这些字符串,然后将字符串转换为float。这个问题的唯一问题是它太慢了。
我已经读过可以使用LOCALE来完成,但不确定。我相信Python / Pandas有更好的方法来处理这些问题。任何提示都将受到高度赞赏。
答案 0 :(得分:2)
这里的假设是df['Revenue']
是一个字符串列。这应该做:
df
Revenue
0 23.979,12 €
1 7.993.137,63 €
2 418,83 €
df['Revenue'] = df['Revenue'].str.replace('[^\d,]', '')\
.str.replace(',', '.', regex=False).astype(float)
df
Revenue
0 23979.12
1 7993137.63
2 418.83
df.Revenue.dtypes
dtype('float64')
删除任何不是数字或逗号的内容。下一个调用会将逗号转换为小数点(我已经关闭了正则表达式引擎,因为它不是必需的),并且最终的astype
调用将其包装起来。
<强>正则表达式强>
[ # character class
^ # negation - ignore anything inside this char group
\d # digit
, # comma
]
piR有一个great suggestion。如果您的数据总能保证我有两位小数,我可以简化您的解决方案:
df['Revenue'] = df['Revenue'].str.replace('[^\d]', '').astype(float) / 100
df
Revenue
0 23979.12
1 7993137.63
2 418.83
正则表达式与之前类似,但现在只保留数字。这也可以防止需要第二次str.replace
呼叫。
答案 1 :(得分:2)
不使用regex
并使用理解
df.assign(
Revenue=[int(i.replace('.', '')) + float(j) / 100
for i, j in (x.split()[0].split(',')
for x in df.Revenue.values.tolist())]
)
Revenue
0 23979.12
1 7993137.63
2 418.83
这与荒谬的
接壤pd.read_csv(
pd.io.common.StringIO(
df[['Revenue']].to_csv(index=None, sep='|')
), decimal=',', thousands='.', delim_whitespace=True, usecols=[0])
Revenue
0 23979.12
1 7993137.63
2 418.83