考虑这个示例数据框
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 代替 ... 尽管这个解决方法可以完成工作,但我想知道是否有更规范的方法来实现我想要的而不收到任何警告。
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)
此代码执行以下操作:
.
删除千位分隔符 (
.str.replace('.', '')
)。
.str.replace(',', '.')
将小数点逗号替换为小数点。
.astype(float)
将修改后的字符串转换为浮点数。