Python_pandas:读取CSV文件、查找指定列和单元格、解决NaN问题

 

目录

为什么不推荐用csv库?

为什么推荐使用pandas读取csv文件?

开始pandas操作csv文件之旅:

0.csv文件预览

1.读取csv文件

2.查找指定列及指定单元格

2.1指定列:通过索引指定列名为hour的列

2.2指定单元格:1001A列23时的AQI值

3.解决遇到的"NAN"


为什么不推荐用csv库?

本段说说使用csv库常见的问题:

  1. csv.DictWriter():该函数返回的结果遍历一次之后,再次遍历返回的结果是空列表。
  2. csv.reader():返回的结果是结构体,需要for循环才能调用,不能像list那样直接选取特定单元格。
  3. 通过列名来查找指定列的操作麻烦。
    #选择特定的单元格
    
    reader = csv.reader(filenanme)
    for row in reader:
        print(row[0])

以上问题如何解决:

  1. 每次循环遍历完,重新使用csv.DictWriter()函数读取文件。
  2. 继续熟练使用。
  3. 转身拥抱pandas。

为什么推荐使用pandas读取csv文件?

  1. 方便,有专门支持读取csv文件的pd.read_csv()函数。
  2. 将csv转换成二维列表形式
  3. 支持通过列名查找特定列。
  4. 相比csv库,事半功倍。

开始pandas操作csv文件之旅:

0.csv文件预览

1.读取csv文件

import pandas as pd

file="E:\data\test.csv"
csvPD=pd.read_csv(file)

2.查找指定列及指定单元格

2.1指定列:通过索引指定列名为hour的列

通过索引找到列的方式:csvPD['hour']

在hour列中找到时间为23的行:
for i in range(len(csvPD)):
    if str(csvPD['hour'][i])=="23":
        print(csvPD['hour'][i])


2.2指定单元格:1001A列23时的AQI值

keyWord="1001A"
for i in range(len(csvPD)):
    if str(csvPD['hour'][i])=="23" and str(csvPD['type'][i])== "AQI":
        result=csvPD[keyWord][i]
        print(result)
        

import pandas as pd

#读取cvs文件
file="E:\data\test.csv"
csvPD=pd.read_csv(file)

#指定列名为hour的列
csvPD['hour']


#在hour列中找到时间为23的行
for i in range(len(csvPD)):
    if str(csvPD['hour'][i])=="23":
        print(csvPD['hour'][i])


#在hour列中找到时间为23时1001A站点的AQI值
keyWord="1001A"
for i in range(len(csvPD)):
    if str(csvPD['hour'][i])=="23" and str(csvPD['type'][i])== "AQI":
        result=csvPD[keyWord][i]
        print(result)
        

3.解决遇到的"NAN"

csv文件中:1002A站点0时的AQI为空白值,返回的结果为NAN

NAN全称:Not A Number

常规解决思路:

  1. 使用numpy函数来判断:np.isnan() 和 xxx is np.nan
  2. 通过运算操作判断:任何数字乘上0都是0
  3. 读取文件时加参数:pd.read_csv(file, keep_default_na=False)

操作结果如下图:

1.推荐使用np.isnan(),csvPD["1002A"][0] is np.nan显示为Flase

2.推荐使用nan*0之后仍是nan,而不是0

3.加了参数后,输出的所有数据类型变为str,nan变为空值,len(result)=0。

代码:

使用函数:

import numpy as np

result=csvPD["1002A"][0]

if np.isnan(result):
    print("该数据为%f,不能参与计算",result)
else:
    print(result)

使用运算方式:

result=csvPD["1002A"][0]

if result*0 == 0 :
    print(result)
else:
    print("该数据为%f,不能参与计算",result)



#若数据大于0
result=csvPD["1002A"][0]

if result > 0 :
    print(result)
else:
    print("该数据为%f,不能参与计算",result)

猜你喜欢

转载自blog.csdn.net/admiz/article/details/107065640