我正在使用以下代码片段阅读此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 = 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将整数和字符串值传递给convert_energy,因此isinstance(energy, float)永远不会被评估为True。而是运行else,并按原样返回这些值,因此结果列是字符串和整数的混合。如果将print(type(energy))放入函数中,这将变得显而易见。

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

因此,只需-

df['Energy Supply'] *= 1000000


会绰绰有余。

10-08 02:57