gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:20 32 4
gpt4 key购买 nike

我正在阅读此 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com