數據的質量直接關乎最后數據分析出來的結果,如果數據有錯誤,在計算和統計后,結果也會有誤。
所以在進行數據分析前,我們必須對數據進行清洗。需要考慮數據是否需要修改、如何修改調整才能適用于之后的計算和分析等。
數據清洗也是一個迭代的過程,實際項目中可能需要不止一次地執行這些清洗操作。
缺省參數 nan
將元素只為None 則顯示為缺省參數NaN
# 讀取數據
file = './data/a.csv'
'''
AAPL, 342, 123, 42, 243, 138, 213
56, 432, 125, 34, 223, 613, ?
56, 123, 182, 44, 213, 313, 121
87, 234, 172, 46, 273, 213, 216
AAPL, 46, 912, 41, 923, 123, 218
AAPL, 23, 172, 46, ?, 213, 216
' ?', 111, 912, 41, 923, ?, 218
'''
# 獲取文件共有多少行
# 這種方法簡單,但是可能比較慢,當文件比較大時甚至不能工作。
lenNum = len(open(file).readlines())
print(lenNum)
# 讀取大文件共多少行
count = 0
for index, line in enumerate(open(file,'r')):
count += 1
print(count)
讀取數據 如果數據不存在或不符合數值規則 用nan填充
delimiter 以什么符號進行分割
skiprows=12 跳過開頭12行 數據是從第13行開始的
usecols 就是獲取下標為6,7列 的內容
unpack=True: 讀取的內容是否分開顯示,默認為False False返回一個大列表, 如果為True 必須多個參數接收數據,每個為一維數組
c,v=np.loadtxt('a.csv', delimiter=',', usecols=(6,7), unpack=True)
# 讀取后的數據類型:numpy.ndarray
缺省數據處理
01 直接填充 適合格式 DataFrame, numpy.ndarray
from sklearn.preprocessing import Imputer
# axis 默認為0 是通過列的平均值來填充 1按行的平均值填充
imputer = Imputer(axis=1)
data = imputer.fit_transform(data)
print(data)
02 刪除
# 過濾掉帶缺省參數的內容 即刪除
# how='all' 行或列只要存在就刪除 axis=0 按行刪除 axis=1 按列刪除
# 將內容轉為DataFrame 類型
data = pd.DataFrame(data)
# print(data)
data2 = data.dropna(axis=1)
print(data2)
DataFrame類型
讀取數據時,沒有頭標簽的要加上header, header=None 否則數據顯示有問題
數據被會names(列標簽)占用,可以先讀取,獲取 行和列,如果沒有頭標簽,再設置names標簽
其他參數: 文件讀取部分數據
skiprows=2 跳過前2行
skiprows=[2] 跳過下標為2的那一行 下標從0開始
nrows=2 讀取n行
chunksize=2 每次讀取的行數 返回可可遍歷列表對象
data = pd.read_csv('./data/a.csv', delimiter=",", skiprows=0, names=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
print(type(data))
print(data)
01、 內容填充 參考上面
02、刪除缺失參數NaN 參考上面
03 指定數據缺省參數
# data = data.fillna(0) # 全0填充
# 指定元素填充 用字典表示 "g":88 g列的全用88填充
# data = data.fillna({"g":88})
04、將 ?替換為nan
# 單個替換
#data = data.replace(" ?", np.nan)
#向前填充 列填充 用缺省參數上面的數字填充
# data = data.replace(['AAPL',' ?'],method='ffill')
#向后填充 列填充 用缺省參數下面的數字填充
# data = data.replace(['AAPL',' ?'],method='bfill')
# 多個替換
# data = data.replace(["AAPL", ' ?'], value=np.nan)
# 多個內容換為多個值
# data = data.replace({"' ?'":88, "AAPL":88, " ?":88})
#正則替換 ??????????????????
#value參數顯示傳遞
data = data.replace(regex=[r'\?|\.|AAPL'],value=np.nan)#用np.nan替換?或.或$原字符
print(data)
其他作用
# df.replace(r'\?|\.|\$',np.nan,regex=True)#用np.nan替換?或.或$原字符
# df.replace([r'\?',r'\$'],np.nan,regex=True)#用np.nan替換?和$
# df.replace([r'\?',r'\$'],[np.nan,'NA'],regex=True)#用np.nan替換?用 NA替換$符號
# df.replace(regex={r'\?':None})
總結:
1、通過 np.genfromtxt(file, delimiter=",", skip_header=0) 在讀取數據時,直接將不符合類型的數據轉為NaN
2、# 將內容轉為DataFrame 類型 再進行其他缺省值處理
3、平均值替換
4、刪除缺省參數
5、指定內容填充
額外補充:
文件寫入時,注意點
# float_format='%.2f' #保留兩位小數
# 寫入時 將行和列下標去除 只保存真實數據
# data.to_csv("frame8.csv", index=False, header=False, float_format='%.2f')
# 如果數據結構中有缺省值NaN時, 在寫入文件時要添加設置缺省參數 na_rap = "NaN" 否則寫入時會顯示空白
# data.to_csv("frame.csv", na_rap = "NaN")