DataFrame踩过的坑--Nan转换--excel读取

记录一些pd.dataFrame踩过的坑

用python做数据分析免不了和pandas打交道,写这篇内容也是为了方便自己以后查阅,如有错误欢迎指正。

Nan强制转换

先介绍下我的数据内容,全部是str类型存放,这样类似’04’这种数据存到excel中,可以保持内容正确。

     a    b    c
0  aaa  NaN  NaN
1  NaN  NaN  247
2  NaN   04  123

将数据强制转换为int类型,来判断’c’列的值是否>200

for i in range(len(data)):
    if int(data.loc[i,'c']) > 200:
        print('ok')

抛出错误如下:

ValueError: cannot convert float NaN to integer

无法将浮点NaN转换为整数

查看一下Nan的类型:

import numpy as np
print(type(np.nan))

显示结果:

<class 'float'>

np.nan是一个float类型,查资料发现,nan无法强制转换为int类型

错误解决方法

原本以为直接判断就很轻松可以解决,代码如下

print(data.loc[0,'c'] is None)
print(data.loc[0,'c'] == np.nan)

显示结果:

False
False
因为空值并不能用判断相等的“==”正确识别
且不是一个“空”对象。

nan,解释是:not a number,不是一个数字,
但是它的类型确是一个float类型。

Nan解决办法

判断单个空值,利用pandas中的isnull(),isna(),
以及numpy中的isnan()代码如下:

print(data.isnull().loc[0,'c'])
print(np.isnan(data.loc[0,'c']))
print(data.isna().loc[0,'c'])

显示结果:

True
True
True

或者以Nan是float类型来判断,前提没有别的数据是float类型

print(type(data.loc[0,'c']) == float)

显示结果:

True

读取excel内容出错

前提,我每次保存数据,都是以str类型保存,否则有些格式保存到excel格式会乱。
这是我的数据表
用pandas来读取数据

data = pd.read_excel('./test.xlsx')

显示结果:

   Unnamed: 0    a    b      c
0           0  aaa  NaN    NaN
1           1  NaN  NaN  247.0
2           2  NaN  4.0  123.0

结果发现多了一行Unamed:0,这个之前用别的电脑环境没遇到过,都是直接读取的。
里面的内容格式大部分都出错了。
查了资料,read_excel的参数有很多,可以很好的解决这两个问题。

index_col:指定列为索引列,默认None列(0索引)用作DataFrame的行标签。
dtype:列的类型名称或字典,默认为None。
data = pd.read_excel('./test.xlsx',index_col = 0,dtype = str)
print(data)

显示结果:

     a    b    c
0  aaa  NaN  NaN
1  NaN  NaN  247
2  NaN   04  123

问题解决了!除了上述的两个,在这里再写几个常用的read_excel()的内置参数

io:传入的excel的路径
sheetname:默认是sheetname = 0,
返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。
注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。
意思是none,和list作为DataFrames的字典
sheetname对应值解释
sheet_name=0第1张作为DataFrame
sheet_name=1第2张作为DataFrame
sheet_name= ‘Sheet2’第2张作DataFrame
sheet_name=[0,1,‘Sheet3’]第1页,第2页和第3页作为DataFrames的字典
header:指定作为列名的行,默认0,即取第一行的值为列名。数据为列名行以下的数据;若数据不含列名,则设定 header = None。
skiprows:省略指定行数的数据  注意:是从第一行开始。
注意:删除行数会导致列名和行索引出错。
data = pd.read_excel('./test.xlsx',index_col = 0,dtype = str,skiprows = 1)
print(data)

显示结果:

   aaa Unnamed: 2 Unnamed: 3
0                           
1  NaN        NaN        247
2  NaN         04        123

删除行之后,索引还在,并且列名也乱了。可以用pandas的重新修改索引和列名的方法

data.reset_index(inplace=True,drop = True)
data.columns=['a','b','c']

显示结果:

     a    b    c
0  NaN  NaN  247
1  NaN   04  123

names:默认为None,指定一个列名:list类型,如不包含标题行,应显示传递header=None。
注意:此时传入列表的名称数需要和头字段数匹配【包括前面的索引列也要算在内】

这些参数有的比较麻烦,我的建议就是先把文件读取进来,用pandas再具体的操作,比如修改列名,索引等。

小白笔记,大家可以一起探讨,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值