将列的值转换为带有欧洲分隔符的数字

问题描述 投票:0回答:3

考虑这个示例数据框

df_1

索引值_1

1 -3.570,00 2 +552,76 3 -1,01 4 -100.234,01

其中浮点值已签名,并使用了欧洲定界符/分隔符:

  • 逗号
    ,
    表示小数
  • 点/点/句点
    .
    数千

我想将此列的值转换为浮点数。如果我尝试这里

的说明
# tag 1
df_1['value_1'] = df_1['value_1'].apply(pd.to_numeric)

我收到错误消息:

ValueError:无法解析位置 <...><...> 处的字符串“

我可以使用这里

的说明
# tag 2
df_1['value_1'] = df_1['value_1'].apply(lambda x: x.replace('.',''))
df_1['value_1'] = df_1['value_1'].apply(lambda x: x.replace(',','.'))
然而,在

# tag 1

之前,我收到消息:

C:\Users\用户名\AppData\Local\Temp\ipykernel_11992�9588848.py:2:SettingWithCopyWarning: 尝试在 DataFrame 的切片副本上设置一个值。 尝试使用 .loc[row_indexer,col_indexer] = value 代替 ...
尽管这个解决方法可以完成工作,但我想知道是否有更规范的方法来实现我想要的而不收到任何警告。

python pandas parsing delimiter
3个回答
3
投票
查看

locale

 模块。 
文档

示例:

import locale locale.setlocale(locale.LC_NUMERIC, 'eu') df.value_1 = df.value_1.apply(locale.atof) print(df)
输出:

value_1 0 -3570.00 1 552.76 2 -1.01 3 -100234.01
    

1
投票
如果您从 CSV 中读取,则可以使用

decimal

thousands
 参数:

df = pd.read_csv(..., decimal=',', thousands='.')
来自

文档

千:str可选

千位分隔符。

十进制:str默认‘.’

识别为小数点的字符 (例如,使用“,”表示欧洲数据)。

感谢atomh33ls在另一个问题上发布几乎完全是这样


0
投票
要在处理欧洲数字格式(其中逗号用于小数点,句号用于数千个分隔符)时将 DataFrame

df_1

 中的值转换为浮点数,并避免 
SettingWithCopyWarning,
,我们可以对 Pandas 使用更直接的方法。 

我看到的警告通常与 Pandas 不确定我们是否正在修改 DataFrame 中的切片副本或原始 DataFrame 本身有关。为了避免这种情况,通常最好使用

.loc

.apply
 来清楚地表明我们正在对原始 DataFrame 进行操作。

这是一种更规范、更简洁的方法来处理转换而不触发警告:

import pandas as pd # Sample DataFrame data = {'value_1': ['-3.570,00', '+552,76', '-1,01', '-100.234,01']} df_1 = pd.DataFrame(data) # Convert European number formats to float df_1['value_1'] = df_1['value_1'].str.replace('.', '').str.replace(',', '.').astype(float) print(df_1)
此代码执行以下操作:

    使用
  1. .
     删除千位分隔符 (
    .str.replace('.', '')
    )。
  2. 使用
  3. .str.replace(',', '.')
     将小数点逗号替换为小数点。
  4. 使用
  5. .astype(float)
     将修改后的字符串转换为浮点数。
通过链接这些方法,我们可以有效地将数据转换为所需的格式,并将更改直接应用于 DataFrame,从而避免出现警告。

© www.soinside.com 2019 - 2024. All rights reserved.