清洗DataFrame遇问题:值的dtype为object,如何转为float64?
问题解答:object类型Series转float64及标准DataFrame生成
为什么ajuste_col的dtype是object?
ajuste_col里混合了字符串(第一行的"AJUSTE")和特殊格式的数值字符串,pandas无法将这种混合类型的序列自动识别为统一的数值类型,只能用objectdtype容纳(object类型可存储任意Python对象,包括字符串和其他类型)。- 数值采用拉美/欧洲风格格式:用
.做千位分隔符,,做小数分隔符,不符合pandas默认的数值解析规则,即使没有字符串表头,这些值也会被识别为字符串而非数值。
转换为float64并生成标准DataFrame的步骤
步骤1:修正表头与数据行
当前ajuste_col里的"AJUSTE"是列名,后续行才是有效数据,先做表头修正:
# 设置列名并跳过表头行 ajuste_col = ajuste_col.rename(ajuste_col.iloc[0])[1:]
步骤2:转换字符串为float64类型
处理千位分隔符和小数分隔符,再转数值类型:
# 移除千位分隔符,替换小数分隔符,转float64 ajuste_col = ajuste_col.str.replace('.', '', regex=False) \ .str.replace(',', '.', regex=False) \ .astype('float64')
步骤3:合并为标准DataFrame(与vencto_col组合)
对vencto_col做同样的表头修正后,合并成DataFrame:
# 处理vencto_col的表头和数据 vencto_col = vencto_col.rename(vencto_col.iloc[0])[1:] # 合并为标准DataFrame final_df = pd.DataFrame({'VENCTO': vencto_col, 'AJUSTE': ajuste_col})
完整代码示例
import pandas as pd url = 'https://www2.bmf.com.br/pages/portal/bmfbovespa/boletim1/SistemaPregao_excel1.asp?Data=&Mercadoria=DI1' df_list = pd.read_html(url) data_raw = df_list[6].copy().drop([0]) # 处理到期日列 vencto_col = data_raw[0] vencto_col = vencto_col.rename(vencto_col.iloc[0])[1:] # 处理调整值列并转换类型 ajuste_col = data_raw[13] ajuste_col = ajuste_col.rename(ajuste_col.iloc[0])[1:] ajuste_col = ajuste_col.str.replace('.', '', regex=False) \ .str.replace(',', '.', regex=False) \ .astype('float64') # 生成最终DataFrame final_df = pd.DataFrame({'VENCTO': vencto_col, 'AJUSTE': ajuste_col}) # 查看结果 print(final_df.info()) print(final_df.head())
内容的提问来源于stack exchange,提问作者Guilherme Rodrigues
相关产品推荐
相关产品推荐

