使用Python / Pandas将欧洲格式的收入图转换为美国版

时间:2017-09-28 09:28:48

标签: python pandas format locale

我有一个数据框,其中收入数据采用德语格式,类似

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有更好的方法来处理这些问题。任何提示都将受到高度赞赏。

2 个答案:

答案 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