特徵 | 常見用法 | ||
不可變數據 | 數字=123 | 用於計算,沒有索引;注意優先級(**》*/》not》and》or) | >>> 17 % 3 # 取餘 2 |
字符串='' | Python 字符串不能被改變,可以添加索引 常用用法:+字符串,*2複製2遍 |
a='string' a[0]='c' #非法 print(a[0]) #合法 print (a * 2) # 輸出字符串兩次 |
|
元組=() | 元組(tuple)與列表類似,不同之處在於元組的元素不能修改。 | tup1 = () # 空元組 tup2 = (20,) # 一個元素,需要在元素後添加逗號 |
|
可變數據 | 列表=[] | 可以被索引,可以更改(不同於字符串),列表中元素的類型可以不相同,+,*依舊有效; |
>>>a = [1, 2, 3, 4, 5, 6] >>>del a[2] #刪除列表元素 |
字典={} | 字典是無序的對象集合,不能通過索引,但可以通過鍵找值(鍵唯一);構造字典方法很多; |
b={'adf':'www','eee':123} a={} #構造空字典 |
|
集合={} | 集合區分其它數據類型很大一個特點就是:集合可以進行交集,差集,補集的運算。創建一個空集合必須用 set() 而不是 { },因爲 { } 是用來創建一個空字典。 |
# set可以進行集合運算 {'b', 'a', 'c', 'r', 'd'}#用{}拆分後表示 |
|
數據類型轉換 | list() |
list() 方法用於將元組,字符串,字典,集合轉換爲列表 其中,字符串轉換成列表,是將字符串中的每個字符轉換成列表的一個元素。 |
aTuple = (123, 'Google') 列表元素 : [123, 'Google'] |
tuple() | tuple()將列表,字符串,字典,集合轉換爲元組;字符串都被單一拆分開來了; |
list1= ['Google', 'Taobao'] ('Google', 'Taobao') |
|
pandas | DataFrame | DataFrame是Python中Pandas庫中的一種數據結構,它類似excel,是一種二維表。 | 可由列表,字典創建 |
小練習:用python處理數據
數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。
數據質量完整性問題:
在介紹數據清洗之前,先學會用python導入數據:
# encoding=utf-8
import pandas as pd
import numpy as np
df = pd.read_csv("C://Users//baihua//Desktop//ceshi.csv",encoding='utf-8') #這裏要注意,如果文件中有中文,本地文件一定要轉換成 UTF-8的編碼格式
print(df)
# encoding=utf-8
import pandas as pd
import numpy as np
from pandas import read_excel
df = pd.read_excel("C://Users//baihua//Desktop//Untitled.xlsx",sheetname='2') #可以導入指定sheet表
print(df)
from pandas import DataFrame
df = DataFrame({
'age': [21, 22, 23],
'name': ['KEN', 'John', 'JIMI']
})
df.to_csv("C://Users//baihua//Desktop//df.csv",sep=',',header=True,index=False)#index默認True,導出行序號;header默認爲true,導出列名
#創建二維DataFrame的三種方法
df1=pd.DataFrame([[1,2,3,4],[2,3,4,5],
[3,4,5,6],[4,5,6,7]],
index=list('ABCD'),columns=list('ABCD'))
df2=pd.DataFrame(np.random.randn(4,4),
index=list('ABCD'),columns=list('ABCD'))
dic1={'name':['小明','小紅','狗蛋','鐵柱'],'age':[17,20,5,40],'gender':['男','女','女','男']}
df3=pd.DataFrame(dic1)
print(df)
print(df1)
print(df2)
print(df3)
A B C D
A 1 2 3 4
B 2 3 4 5
C 3 4 5 6
D 4 5 6 7
A B C D
A -0.014269 -0.336968 0.656946 0.997784
B 0.689218 0.689966 0.560216 -0.447383
C -0.488228 -0.106600 0.063934 0.733151
D -0.916339 0.166839 0.083495 0.859965
name age gender
0 小明 17 男
1 小紅 20 女
2 狗蛋 5 女
3 鐵柱 40 男
完整性:單條數據是否存在空值,統計的字段是否完善。
全面性:觀察某一列的全部數值,比如在 Excel 表中,我們選中一列,可以看到該列的平均值、最大值、最小值。我們可以通過常識來判斷該列是否有問題,比如:數據定義、單位標識、數值本身。
合法性:數據的類型、內容、大小的合法性。比如數據中存在非 ASCII 字符,性別存在了未知,年齡超過了 150 歲等。
唯一性:數據是否存在重複記錄,因爲數據通常來自不同渠道的彙總,重複的情況是常見的
1完整性&空行
刪除:觀看數據分佈,如果缺失數據不多,就刪除數據缺失的記錄;(數據少,這種方法就不可取;或是缺失數據非隨機,刪除就可能導致數據從正態變爲非正態)
均值:使用當前列的均值;(數據正態分佈用均值替換NA較好)
中位數:使用當前列的中位數;(數據分佈由於異常值存在而不是正太分佈的情況下,使用中位數效果比較好。
高頻:使用當前列出現頻率最高的數據。(容易改變數據的分佈
不常用:0代替缺失值(對極端值,平均值影響較大)
相似:用k近鄰的方法,尋找相似值來替換缺失值;(缺失值填補的準確性就要看聚類結果的好壞了,而聚類變數較大)
擬合:如果缺失後數據符合迴歸趨勢,那麼就擬合方程測定缺失值;(缺失值連續,纔可以使用迴歸預測,但預測方程出來了,反過去填缺失值,不是顯得白癡!
# encoding=utf-8
import pandas as pd
import numpy as np
df = pd.read_csv("C://Users//baihua//Desktop//ceshi.csv",encoding='utf-8') #這裏要注意,如果文件中有中文,本地文件一定要轉換成 UTF-8的編碼格式
print(df)
df.dropna(how='all',inplace=True) #刪除空行
print(df)
df['Population'].fillna(df['Population'].mean(), inplace=True)#xx列缺失值用平均數替換
print(df)
df['Population'].fillna(df['Population'].median(), inplace=True)#xx列缺失值用中位數替換
print(df)
age_maxf = df['Population'].value_counts().index[0]
df['Population'].fillna(age_maxf, inplace=True)#xx列缺失值用出現頻率最高的的數代替
print(df)
我們發現數據中有一個空行,除了 index 之外,全部的值都是 NaN。Pandas 的 read_csv() 並沒有可選參數來忽略空行,可以通過dropna來刪除空行。python內置函數使用:變量=操作對象.函數
2. 全面性
#修改列名
# encoding=utf-8
import pandas as pd
import numpy as np
df = pd.read_excel("C://Users//baihua//Desktop//accountMessage.xlsx",encoding='utf-8') #這裏要注意,如果文件中有中文,本地文件一定要轉換成 UTF-8的編碼格式
print(df)
df.rename(columns={1:'Firstname', 2:'Lastname',3:'Age',4:'Weight'}, inplace =True)#字典的好處就是可以隨意修改列命,沒修改的默認
print(df)
weight 列的數值,我們能發現 weight 列的單位不統一。有的單位是千克(kgs),有的單位是磅(lbs)。
這裏我使用千克作爲統一的度量單位,將磅(lbs)轉化爲千克(kgs):
# encoding=utf-8
import pandas as pd
import numpy as np
df = pd.read_excel("C://Users//baihua//Desktop//accountMessage.xlsx",encoding='utf-8') #這裏要注意,如果文件中有中文,本地文件一定要轉換成 UTF-8的編碼格式
print(df)
df.rename(columns={1:'Firstname', 2:'Lastname',3:'Weight',4:'Age'}, inplace =True)
print(df)
# 獲取 weight 數據列中單位爲 lbs 的數據
rows_with_lbs = df['Weight'].str.contains('lbs').fillna(False)
print(df[rows_with_lbs])
# 將 lbs 轉換爲 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
Weight=int(float(lbs_row['Weight'][:-3])/2.2)## 截取從頭開始到倒數第三個字符之前,即去掉 lbs。
df.at[i,'Weight'] = '{}kgs'.format(Weight)
print(df)
3合法性
在數據中不難發現,姓名列(Name)包含了兩個參數 Firtname 和 Lastname,我們使用 Python 的 split 方法,str.split(expand=True),將列表拆成新的列,再將原來的 Name 列刪除。
# 切分名字,刪除源數據列(切分名字實際生成了新列,新列會添加到最後)
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
# 刪除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
print(df)
4唯一性
我們校驗一下數據中是否存在重複記錄。如果存在重複記錄,就使用 Pandas 提供的 drop_duplicates() 來刪除重複數據。
df.drop_duplicates(['first_name','last_name'],inplace=True)
print(df)
總結:數據處理很繁雜,很枯燥,這才顯得有價值啊,能輕易學會的也容易被替代!數據處理過程中,會遇到各種各樣的數據問題,需要我們靈活使用python函數,多看博客(避免重複造輪子)多思考(思考纔能有進步)多敲代碼(反饋是區分無效學習的重要指標)。
最後做一個完整的數據處理練習:
# encoding=utf-8
import pandas as pd
import numpy as np
import re
df = pd.read_excel("C://Users//baihua//Desktop//kehou.xlsx",encoding='utf-8') #這裏要注意,如果文件中有中文,本地文件一定要轉換成 UTF-8的編碼格式
df['food']=df['food'].str.lower()
df['ounces'].fillna(df['ounces'].median(),inplace=True)
df['ounces']=df['ounces'].apply(lambda a:abs(a))#將ounces列中的負值取絕對值,lambda是匿名函數
參考文獻: