当前位置: 首页 > 面试题库 >

将read_excel与转换器一起用于将Excel文件读取到Pandas DataFrame中会导致对象类型的数字列

俞博涛
2023-03-14
问题内容

我正在使用以下代码段阅读此Excel文件“联合国能源指标”:

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将读入该列并尝试“解释”您的数据。通过指定自己的转换器,可以覆盖熊猫转换,因此不会发生这种情况。

熊猫将整数和字符串值传递到了convert_energy,因此isinstance(energy, float)永远不会求到True。而是else运行,并且这些值按原样返回,因此您得到的列是字符串和整数的混合。如果print(type(energy))在函数内部放一个,这很明显。

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

因此,只需-

df['Energy Supply'] *= 1000000

会绰绰有余。



 类似资料:
  • 我正在创建一个由数组支持的泛型类型堆栈。当我尝试创建泛型类型数组时,Java不允许我这样做。有人告诉我,我必须创建一个类型为Object的数组,并将其转换为泛型类型。我已经将对象数组转换为类型,但如何处理Java不断给我的未检查类型错误? 这就是我目前所处的位置。 更新:我正在创建一个对象数组,然后在方法的末尾将返回类型转换为T类型。

  • 问题内容: 我正在使用返回“对象”类型的普通对象的Web服务。调试清楚地表明此对象中存在某种Array,因此我想知道如何将“ Object”转换为Array(或类似对象)? 我尝试了以下方法: 但是没有任何效果。我总是得到一个InvocationTargetException。 我究竟做错了什么? 编辑 : 可悲的是,我不得不删除指向显示Eclipse调试器输出的图像的链接,因为它不再可用。请不要

  • 问题内容: 在Java中,从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,而第一行却没有? 问题答案: 这是因为在执行时,由于 类型Erase 不会 真正 检查对象是否为a 。真的只是将其投射到。例如: __ 有关更多信息,请参见Angelika Langer的Java泛型常见问题解答 ,尤其是类型擦除部分。

  • 如何用Java将一个Excel的文件的数据读取到另一个Excel中? 我有两个excel文件,希望将A文件中的数据合并在B文件中。有没有推荐的方案

  • 我尝试将xlsx读入数据帧: 我收到这个: 回溯(最近一次调用last):文件“C:\Users\Administrator\eclipse workspace\Reports\GOW\Report.py”,第44行,df=pd。读取excel('C:\Users\Administrator\Downloads\reportdata.xlsx') 文件“C:\Users\Administrator

  • 我有以下几门课: 我希望能够有一个具有JSON格式的文件,这样: 该文件是所有对象的列表。所以我试图创建两种方法: 将转换为JSON文件的方法。 方法,该方法将JSON文件读入。 在Java 8中实现这一点的最佳方式(最优雅的方式)是什么?我是否需要向类添加一些方法?还是有别的办法? 既然它是一个只包含字符串的对象列表,那么有什么优雅的东西吗?