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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章