目錄
爲什麼不推薦用csv庫?
本段說說使用csv庫常見的問題:
- csv.DictWriter():該函數返回的結果遍歷一次之後,再次遍歷返回的結果是空列表。
- csv.reader():返回的結果是結構體,需要for循環才能調用,不能像list那樣直接選取特定單元格。
- 通過列名來查找指定列的操作麻煩。
#選擇特定的單元格 reader = csv.reader(filenanme) for row in reader: print(row[0])
以上問題如何解決:
- 每次循環遍歷完,重新使用csv.DictWriter()函數讀取文件。
- 繼續熟練使用。
- 轉身擁抱pandas。
爲什麼推薦使用pandas讀取csv文件?
- 方便,有專門支持讀取csv文件的pd.read_csv()函數。
- 將csv轉換成二維列表形式
- 支持通過列名查找特定列。
- 相比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
常規解決思路:
- 使用numpy函數來判斷:np.isnan() 和
xxx is np.nan - 通過運算操作判斷:任何數字乘上0都是0
- 讀取文件時加參數: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)