记录一些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再具体的操作,比如修改列名,索引等。