python掃盲系列(5)--列表、元組、字典、集合

    特徵 常見用法
不可變數據 數字=123 用於計算,沒有索引;注意優先級(**》*/》not》and》or) >>> 17 % 3 # 取餘 
2
字符串='' Python 字符串不能被改變,可以添加索引
常用用法:+字符串,*2複製2遍

a='string'

a[0]='c' #非法

print(a[0]) #合法

print (a * 2)      # 輸出字符串兩次
print (a + "TEST") # 連接字符串

元組=() 元組(tuple)與列表類似,不同之處在於元組的元素不能修改。 tup1 = ()    # 空元組
tup2 = (20,) # 一個元素,需要在元素後添加逗號
可變數據 列表=[] 可以被索引,可以更改(不同於字符串),列表中元素的類型可以不相同,+,*依舊有效;

>>>a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9 #通過索引改列表

>>>del a[2] #刪除列表元素

字典={} 字典是無序的對象集合,不能通過索引,但可以通過鍵找值(鍵唯一);構造字典方法很多;

b={'adf':'www','eee':123}
#print (b[0]) #錯誤!字典是無序的,只能通過鍵來引用。
print (b['adf'])#合法

a={} #構造空字典

集合={} 集合區分其它數據類型很大一個特點就是:集合可以進行交集,差集,補集的運算。創建一個空集合必須用 set() 而不是 { },因爲 { } 是用來創建一個空字典

# set可以進行集合運算
a = set('abracadabra')
b = set('alacazam')
print(a)         #a是去除重複值

{'b', 'a', 'c', 'r', 'd'}#用{}拆分後表示
print(a - b)     # a 和 b 的差集

數據類型轉換 list()

list() 方法用於將元組,字符串,字典,集合轉換爲列表

其中,字符串轉換成列表,是將字符串中的每個字符轉換成列表的一個元素。

aTuple = (123, 'Google')
list1 = list(aTuple) #原組轉換列表
print ("列表元素 : ", list1)

列表元素 :  [123, 'Google']

tuple() tuple()將列表,字符串,字典,集合轉換爲元組;字符串都被單一拆分開來了;

list1= ['Google', 'Taobao']
b=tuple(list1)
print (b)

('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是匿名函數

 

參考文獻:

python字符串函數

python列表函數方法

python元組函數方法

python字典函數方法

python集合函數方法

pandas中DataFrame用法

pandas中Series用法

python缺失值處理

python修改列名

對照excel學python數據處理

lambda等匿名函數

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