python - 将 read_excel 与转换器一起使用以将 Excel 文件读入 Pandas DataFrame 会导致对象类型的数字列

标签 python excel pandas dataframe

我正在阅读此 Excel 文件 United Nations Energy Indicators使用此处的代码片段:

def convert_energy(energy):
    if isinstance(energy, float):
        return energy*1000000
    else:
        return energy

def energy_df():
    return pd.read_excel("Energy Indicators.xls", skiprows=17, skip_footer=38, usecols=[2,3,4,5], na_values=['...'], names=['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable'], converters={1: convert_energy}).set_index('Country')

这导致 Energy Supply 列具有对象类型而不是 float。为什么会这样?

energy = energy_df()
print(energy.dtypes)

Energy Supply                object
Energy Supply per Capita    float64
% Renewable                 float64

最佳答案

让我们暂时删除 converters 参数 -

c = ['Energy Supply', 'Energy Supply per Capita', '% Renewable']
df = pd.read_excel("Energy Indicators.xls", 
                   skiprows=17, 
                   skip_footer=38, 
                   usecols=[2,3,4,5], 
                   na_values=['...'], 
                   names=c,
                   index_col=[0])

df.index.name = 'Country'
df.head()    
                Energy Supply  Energy Supply per Capita  % Renewable
Country                                                             
Afghanistan             321.0                      10.0    78.669280
Albania                 102.0                      35.0   100.000000
Algeria                1959.0                      51.0     0.551010
American Samoa            NaN                       NaN     0.641026
Andorra                   9.0                     121.0    88.695650

df.dtypes

Energy Supply               float64
Energy Supply per Capita    float64
% Renewable                 float64
dtype: object

您的数据无需转换器即可正常加载。有一个技巧可以理解为什么会发生这种情况。

默认情况下,pandas 将读取列并尝试“解释”您的数据。通过指定您自己的转换器,您可以覆盖 pandas 转换,因此不会发生这种情况。

pandas 将整数和字符串值传递给 convert_energy,因此 isinstance(energy, float) 永远不会被评估为 True。相反,else 运行,并且这些值按原样返回,因此您的结果列是字符串和整数的混合。如果将 print(type(energy)) 放入函数中,这将变得显而易见。

由于您混合了多种类型,因此结果类型为 object。但是,如果您不使用转换器,pandas 将尝试解释您的数据,并将成功地将其解析为数字。

所以,只是做 -

df['Energy Supply'] *= 1000000

足够了。

关于python - 将 read_excel 与转换器一起使用以将 Excel 文件读入 Pandas DataFrame 会导致对象类型的数字列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48036296/

相关文章:

sql - 使用 SSIS 清除 Excel 中的数据

python - os.path.exists 与 os.path.isdir 之间的优缺点

python - Web 字体总是从静态路径返回 404

excel - 具有多列的 Excel 中的唯一值

excel - 如何修复 VBA 运行时错误 70 权限被拒绝

python - 将 csv 文件加载到 pandas 数据框中

python - 为什么python 2.5中threading.Thread通过阻塞执行来同步操作?

Python 匹配元组的问题

python - 在 Pandas 中使用正则表达式提取特定单词

python - 在 Pandas 中保存 .csv 文件中应用的 DateTime 格式