- 清洗空值
- 清洗重複值
- 清洗異常值
數據的導入與導出:參考博客:
https://www.cnblogs.com/dev-liu/p/pandas_2.html
有兩種丟失數據:
None
None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。
np.nan(NaN)
np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。
①.pandas中的None與NaNhtml
pandas中None與np.nan都視做np.nan
建立含空值的數據python
from pandas import Series,DataFrame import pandas as pd import numpy as np
df = DataFrame(data=np.random.randint(0,100,size=(10,8))) df.iloc[1,3] = None df.iloc[3,5] = np.nan df.iloc[6,2] = None df.iloc[8,5] = np.nan df
② 刪除整行記錄數組
第一種經過判斷app
第二種 經過裝飾好的內置函數dom
df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列
③填充數據函數
fillna():value和method參數
value : 直接寫要填充的值
method: ffill :之前面爲基礎填充
bfill: 之後面爲基礎填充
axis: 0 : 列
1 : 行
①建立有重複的數據工具
import numpy as np import pandas as pd from pandas import Series,DataFrame
df = DataFrame(data=np.random.randint(0,100,size=(8,5)))
df.iloc[2] = [6,6,6,6,6]
df.iloc[4] = [6,6,6,6,6]
df.iloc[6] = [6,6,6,6,6]
dfui
② 使用duplicated 進行去重spa
參數:
keep:
first:保留第一個
last: 保留最後一個
③ 使用drop_duplicates()函數刪除重複的行rest
drop_duplicates(keep='first/last'/False)
①建立數據
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
要求:
對df應用篩選條件,去除標準差太大的數據:假設過濾條件爲 C列數據大於兩倍的C列標準差
std_2 = df['C'].std() * 2 std_2
# 0.5888958710508151
# 取反
~(df['C'] > std_2)
最終:
df.loc[~(df['C'] > std_2)]
pd.concat,
參數:
objs axis= 0 :列
1 :行 keys join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配),
而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯 ignore_index=False
pd.append
①建立數據
import numpy as np from pandas import DataFrame,Series import pandas as pd
df1 = DataFrame(data=np.random.randint(0,100,size=(4,4)),index=['A','B','C','D'],columns=['a','b','c','d']) df2 = DataFrame(data=np.random.randint(0,100,size=(4,4)),index=['A','B','C','E'],columns=['a','b','c','e'])
②匹配的級聯
③不匹配的級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致
有2種鏈接方式:
外鏈接:補NaN(默認模式)
內鏈接:只鏈接匹配的項
使用pd.merge()合併
merge與concat的區別在於,merge須要依據某一共同的列來進行合併
使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。
注意每一列元素的順序不要求一致
參數:
how:outer取並集 不存在時用 NaN補充, inner取交集, left:以左側爲準, right:以右側爲準
on:當有多列相同的時候,能夠使用on來指定使用那一列進行合併,on的值爲一個列表
①一對一合併
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering'], })
df2 = DataFrame({'employee':['Lisa','Bob','Jake'], 'hire_date':[2004,2008,2012], })
②多對一合併
df3 = DataFrame({ 'employee':['Lisa','Jake'], 'group':['Accounting','Engineering'], 'hire_date':[2004,2016]})
df4 = DataFrame({'group':['Accounting','Engineering','Engineering'], 'supervisor':['Carly','Guido','Steve'] })
③多對多合併
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering']})
df5 = DataFrame({'group':['Engineering','Engineering','HR'], 'supervisor':['Carly','Guido','Steve'] })
④ key的標準化
第一種:
當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名
第二種:
當兩張表沒有可進行鏈接的列時,可以使用left_on和right_on手動指定merge中左右兩邊的哪一列列做爲鏈接的列
⑤內合併和外合併
普通替換: 替換全部符合要求的元素:to_replace=15,value='e'
按列指定單值替換: to_replace={列標籤:替換值}
map()能夠映射新一列數據
map()中能夠使用lambd表達式
map()中能夠使用方法,能夠是自定義的方法
eg:map({to_replace:value})
注意 map()中不能使用sum之類的函數,for循環
map當作一種運算工具,至於執行何種運算,是由map函數的參數決定的(參數:lambda,函數)
#超過3000部分的錢繳納50%的稅 def after_sal(s): return s - (s - 3000)*0.5
使用.take()函數排序 - take()函數接受一個索引列表,用數字表示,使得df根據列表中索引的順序進行排序 - eg:df.take([1,3,4,2,5])
能夠藉助np.random.permutation()函數隨機排序
np.random.permutation(x)能夠生成x個從0-(x-1)的隨機數列
df.take(axis=1,indices=np.random.permutation(3)).take(axis=0,indices=np.random.permutation(1000)) df.take(axis=1,indices=np.random.permutation(3)).take(axis=0,indices=np.random.permutation(1000))[0:100]
數據聚合是數據處理的最後一步,一般是要使每個數組生成一個單一的數值。 數據分類處理: - 分組:先把數據分爲幾組 - 用函數處理:爲不一樣組的數據應用不一樣的函數以轉換數據 - 合併:把不一樣組獲得的結果合併起來 數據分類處理的核心: - groupby()函數 - groups屬性查看分組狀況 - eg: df.groupby(by='item').groups
from pandas import DataFrame,Series
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'], 'price':[4,3,3,2.5,4,2], 'color':['red','yellow','yellow','green','green','green'], 'weight':[12,20,50,30,20,44]}) df
使用groupby分組後,也能夠使用transform和apply提供自定義函數實現更多的運算
df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum) transform和apply都會進行運算,在transform或者apply中傳入函數便可 transform和apply也能夠傳入一個lambda表達式
# 函數
def fun(s): sum = 0 for i in s: sum+=i return sum/s.size
需求: 導入文件,查看原始數據 將人口數據和各州簡稱數據進行合併 將合併的數據中重複的abbreviation列進行刪除 查看存在缺失數據的列 找到有哪些state/region使得state的值爲NaN,進行去重操做 爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN 合併各州面積數據areas 咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行 去除含有缺失數據的行 找出2010年的全民人口數據 計算各州的人口密度 排序,並找出人口密度最高的五個州 df.sort_values()
1.讀取文件usa_election.txt 2.查看文件樣式及基本信息 3.【知識點】使用map函數+字典,新建一列各個候選人所在黨派party 4.使用np.unique()函數查看colums:party這一列中有哪些元素 5.使用value_counts()函數,統計party列中各個元素出現次數,value_counts()是Series中的,無參,返回一個帶有每一個元素出現次數的Series 6.【知識點】使用groupby()函數,查看各個黨派收到的政治獻金總數contb_receipt_amt 7.查看具體天天各個黨派收到的政治獻金總數contb_receipt_amt 。使用groupby([多個分組參數]) 8. 將表中日期格式轉換爲'yyyy-mm-dd'。日期格式,經過函數加map方式進行轉換 9.獲得天天各政黨所收政治獻金數目。 考察知識點:groupby(多個字段) 10.【知識點】使用unstack()將上面所得數據中的party行索引變成列索引 11.查看老兵(捐獻者職業)DISABLED VETERAN主要支持誰 :查看老兵們捐贈給誰的錢最多 12.把索引變成列,Series變量.reset_index() 13.找出各個候選人的捐贈者中,捐贈金額最大的人的職業以及捐獻額 .經過query("查詢條件來查找捐獻人職業")
import numpy as np import pandas as pd from pandas import Series,DataFrame
months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6, 'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12} of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick', 'Paul, Ron', 'Gingrich, Newt'] parties = { 'Bachmann, Michelle': 'Republican', 'Romney, Mitt': 'Republican', 'Obama, Barack': 'Democrat', "Roemer, Charles E. 'Buddy' III": 'Reform', 'Pawlenty, Timothy': 'Republican', 'Johnson, Gary Earl': 'Libertarian', 'Paul, Ron': 'Republican', 'Santorum, Rick': 'Republican', 'Cain, Herman': 'Republican', 'Gingrich, Newt': 'Republican', 'McCotter, Thaddeus G': 'Republican', 'Huntsman, Jon': 'Republican', 'Perry, Rick': 'Republican' }
讀取數據