利用Python資料分析:資料規整化(四)
阿新 • • 發佈:2018-12-31
# 移除重複項 data = DataFrame({'k1':['one'] * 3 +['two'] * 4, 'k2':[1,1,2,3,3,4,4]}) data data.duplicated() # 返回一個布林型別的Series來表示各行是否為重複行 (duplicated adj. 複製出的,複寫書的) data.drop_duplicates() # 丟棄掉重複的行 data['v1'] = range(7) data.duplicated(['k1']) # 指定部分列進行重複判斷 data.drop_duplicates(['k1']) # 根據某一列進行過濾重複項 data.drop_duplicates(['k1','k2'],take_last = True) #duplicated和drop_duplicates預設保留的是一個出現的值,可以指定為最後一個 # 利用函式或者對映進行資料轉換 (根據陣列、Series或者DataFrame列中的值來實現轉換工作 data = DataFrame({'food':['bacon','pulled pork','bacon','Pastrami', 'corned beef','Bacon','pastrami','honey ham','nova lox'], 'ounces':[4,3,12,6,7.5,8,3,5,6]}) data # 新增一列來表示肉類食物來源的動物型別 meat_to_animal = { 'bacon':'pig', 'pulled pork':'pig', 'pastrami':'cow', 'corned beef':'cow', 'honey ham':'pig', 'nova lox':'salmon' } # 先編寫一個肉類到動物的對映 # Series的map方法可以接受一個函式或者含有對映關係的字典型物件 data['animal'] = data['food'].map(str.lower).map(meat_to_animal) # 先將其全部轉成小寫格式 data data['food'].map(lambda x:meat_to_animal[x.lower()]) # 使用lambda表示式做相同內容的工作 # 替換值 data = Series([1.,-999,2,-999,-1000,3]) data data.replace(-999,np.nan) # 將-999替換成一個缺失值,產生的是一個新的Series data.replace([-999,-1000],np.nan) # 傳入一個列表一次替換多個值 data.replace([-999,-1000],[np.nan,0]) # 使用兩個列表來對不同的值替換成不同的值 data.replace({-999:np.nan,-1000:0}) # 傳入的引數也可以是字典 # 重新命名軸索引 data = DataFrame(np.arange(12).reshape((3,4)), index=['Ohio','Colorado','New York'], columns=['one','two','three','four']) data.index.map(str.upper) # 使用map方法來把標籤大寫 data.index = data.index.map(str.upper) # 通過賦值的方法就地修改Dataframe的軸標籤 data data.rename(index=str.title,columns=str.upper) # 使用rename方法修改的是副本 data.rename(index={'OHIO':'INDIANA'}, columns={'three':'peekaboo'}) # 結合字典型物件實現對部分軸標籤的更新 _ = data.rename(index={'OHIO':'INDIANA'},inplace=True) # 想要就地修改只要傳入inplace = T即可 data # 離散化和麵元的劃分 ages = [20,22,25,27,21,23,37,31,61,45,41,32] bins = [18,25,35,60,100] # 按照18~25 25~35 35~60 60~100 的區間進行劃分 cats = pd.cut(ages,bins) cats # 返回的是一個特殊的Categorical物件,可以看成一個表示面元名稱的字串 cats.labels # 表示所對應的元素屬於哪個區間 cats.levels # 顯示所劃分的區間 pd.value_counts(cats) # 計算每個區間的數量 pd.cut(ages,[18,26,36,61,100],right=False) # 修改為左邊為開區間,右邊為閉區間 group_names = ['Youth','YoungAdult','MiddleAged','Senior'] # 自己定義分組的名字 pd.cut(ages,bins,labels=group_names) # 使用labels標籤來設定 data = np.random.rand(20) # 生成一個隨機數 pd.cut(data,4,precision=2) # 傳入的可以是面元的數量而不是確定的便捷這時候會根據資料的最大最小值計算等長的面元 # precision adj. 精確的,準確的,細緻的; 嚴守標準的; 行動精確的; data = np.random.randn(1000) # 正態分佈 cats = pd.qcut(data,4) # qcut 按照分位數來進行面元的劃分這裡是按照四分位數進行切割 cats pd.value_counts(cats) pd.qcut(data,[0,0.1,0.5,0.9,1]) # 設定指定的分位數 包含端點 pd.value_counts(pd.qcut(data,[0,0.1,0.5,0.9,1])) # 檢測和過濾異常值 np.random.seed(12345) data = DataFrame(np.random.randn(1000,4)) data.describe # 整個資料的概覽 col = data[3] # 找出某列絕對值>3的值 col[np.abs(col) > 3] data[(np.abs(data) > 3).any(1)] # 選出全部含有超過3或者-3的值的行 data[np.abs(data)> 3] = np.sign(data) *3 # 將值限制在【-3,3】 data.describe # 排列和隨機取樣 df = DataFrame(np.arange(5 * 4).reshape(5,4)) sampler = np.random.permutation(5) sampler df df.take(sampler) # 隨機重排列 df.take(np.random.permutation(len(df))[:3]) bag = np.array([5,7,-1,6,4]) sampler = np.random.randint(0,len(bag),size=10) sampler # 使用randint得到一組隨機整數 draws = bag.take(sampler) draws