【Python】merge:数据规整化:清理、转换、合并、重塑
生活随笔
收集整理的這篇文章主要介紹了
【Python】merge:数据规整化:清理、转换、合并、重塑
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
merge:數(shù)據(jù)規(guī)整化:清理、轉(zhuǎn)換、合并、重塑
5 離散化和面元?jiǎng)澐?/h4>
目錄:
文章目錄
- @[toc]
- 一 合并數(shù)據(jù)集
- 1 數(shù)據(jù)庫風(fēng)格的DataFrame合并
- 2 索引上的合并
- 3 軸向連接
- 4 合并重疊數(shù)據(jù)
- 二 重塑和軸向旋轉(zhuǎn)
- 1 重塑層次化索引
- 2 將“長格式”轉(zhuǎn)換為“寬格式”
- 三 數(shù)據(jù)轉(zhuǎn)換
- 1 移除重復(fù)數(shù)據(jù)
- 2 利用函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換
- 3 替換值
- 4 重命名軸索引
- 5 離散化和面元?jiǎng)澐?/li>
- 6 檢測和過濾異常值
- 7 排列和隨機(jī)采樣
- 8 計(jì)算指標(biāo)/啞變量
- 四 字符串操作
- 1 字符串對象方法
- 2 正則表達(dá)式
- 3 pandas中矢量化的字符串函數(shù)
- 五 END
- @[toc]
- 一 合并數(shù)據(jù)集
- 1 數(shù)據(jù)庫風(fēng)格的DataFrame合并
- 2 索引上的合并
- 3 軸向連接
- 4 合并重疊數(shù)據(jù)
- 二 重塑和軸向旋轉(zhuǎn)
- 1 重塑層次化索引
- 2 將“長格式”轉(zhuǎn)換為“寬格式”
- 三 數(shù)據(jù)轉(zhuǎn)換
- 1 移除重復(fù)數(shù)據(jù)
- 2 利用函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換
- 3 替換值
- 4 重命名軸索引
- 5 離散化和面元?jiǎng)澐?/li>
- 6 檢測和過濾異常值
- 7 排列和隨機(jī)采樣
- 8 計(jì)算指標(biāo)/啞變量
- 四 字符串操作
- 1 字符串對象方法
- 2 正則表達(dá)式
- 3 pandas中矢量化的字符串函數(shù)
- 五 END
- 數(shù)據(jù)分析和建模方面的大量編程工作都是用在數(shù)據(jù)準(zhǔn)備上的:加載、清理、轉(zhuǎn)換以及重塑。pandas和python標(biāo)準(zhǔn)庫提供了一組高級的、靈活的、高效的核心函數(shù)和算法。
一 合并數(shù)據(jù)集
- pandas.merge可根據(jù)一個(gè)或多個(gè)鍵將不同DataFrame中的行連接起來。SQL或其他關(guān)系型數(shù)據(jù)庫對此思維應(yīng)用比較常見。
- pandas.concat可以沿著一條軸將多個(gè)對象堆疊在一起。
- 實(shí)例方法combine_first可以將重復(fù)數(shù)據(jù)編接在一起,用一個(gè)對象中的值填充另一個(gè)對象中的缺失值。
1 數(shù)據(jù)庫風(fēng)格的DataFrame合并
- 數(shù)據(jù)集的合并(merge)或連接(join)運(yùn)算是通過一個(gè)或多個(gè)鍵將行鏈接起來的。這些運(yùn)算是關(guān)系型數(shù)據(jù)的核心。pandas的merge函數(shù)是對數(shù)據(jù)應(yīng)用這些算法的主要切入點(diǎn)。
- 默認(rèn)情況下,merge做的是“inner”連接,結(jié)果中的鍵是交集。其他方式還有“l(fā)eft”、“right”、“outer”。外連接求取的是鍵的并集,組合了左連接和右連接的效果。
- 多對多的合并操作非常簡單,無需額外的操作。多對多的連接產(chǎn)生 的是行的笛卡爾積,左邊b行,右邊a行,結(jié)果中就有a*b行。連接方式只影響出現(xiàn)在結(jié)果中的鍵。
- 要根據(jù)多個(gè)鍵進(jìn)行合并,傳入一個(gè)由列名組成的列表即可。結(jié)果中會(huì)出現(xiàn)哪些鍵的組合取決于所選的合并方式,也可以這樣理解:多個(gè)鍵形成一系列元組,并將其當(dāng)作單個(gè)連接鍵(實(shí)際上并不是這么回事)
- 合并運(yùn)算需要考慮的最后一個(gè)問題是對重復(fù)列名的處理。雖然可以手動(dòng)更改,但是merge有一個(gè)更實(shí)用的suffixes選項(xiàng),用于指定附加到左右兩個(gè)DataFrame對象的重疊列名上的字符串。
- merge函數(shù)的參數(shù):
- ① left # 用于合并的左側(cè)DataFrame
- ② right # 用于合并的右側(cè)DataFrame
- ③ how # “inner”、“outer”、“l(fā)eft”、‘“right”其中之一,默認(rèn)為“inner”
- ④ on # 用于連接的列名
- ⑤ left_on、tight_on # 左右側(cè)DataFrame分別指定鍵
- ⑥ left_index、right_index # 左右側(cè)將索引用作連接鍵
- ⑦ sort# 合并后進(jìn)行排序,默認(rèn)為True,處理大數(shù)據(jù)時(shí),最好禁用
- ⑧ suffixes # 字符串元組,用于追加到重疊列名的結(jié)尾,默認(rèn)為“_x”、“_y”
- ⑨ copy # 默認(rèn)為Flase,可以在某種特殊情況下禁用,默認(rèn)總是復(fù)制。
2 索引上的合并
- 有時(shí)候,DataFrame中的連接鍵位于其索引中,這種情況下,可以傳入left_index、right_index = True,或兩個(gè)都傳以說明索引應(yīng)該被用作連接鍵。
- 對于層次化索引的數(shù)據(jù),必須以列表的形式指明用作合并鍵的多個(gè)列(注意對重復(fù)索引值的處理),同時(shí)使用合并雙方的索引也沒問題。
DataFrame還有一個(gè)join實(shí)例方法,可以更為方便地實(shí)現(xiàn)按索引合并。還可以用于合并多個(gè)帶有相同或相似索引的DataFrame對象,而不管它們有沒有之間有沒有重疊的列。
3 軸向連接
- 另一種數(shù)據(jù)合并運(yùn)算也被稱作連接(concatenation)、綁定(binding)或堆疊(stacking)。Numpy有一個(gè)用于合并原始Numpy數(shù)組的concatenation函數(shù)。
- pandas的concat函數(shù)提供了一種能夠解決用于連接的軸、對結(jié)果對象中的分組,因索引不同造成的交并集結(jié)果等問題。
- concat函數(shù)的參數(shù):
- ① objs # 參與連接的pandas對象,唯一必要的參數(shù)
- ② axis # 指明連接的軸向,默認(rèn)為0
- ③ join # “inner”、“outer”其中之一,默認(rèn)為“outer”
- ④ koin_axes # 指明用于其他N-1條軸的索引,不執(zhí)行交并集運(yùn)算
- ⑤keys 與連接對象有關(guān)的值,用于形成連接軸向上的層次化索引
- ⑥ levels # 指定用作層次化索引各級別上的索引
- ⑦ names # 用于創(chuàng)建分層級別的名稱
- ⑧ verify_integrity # 檢查結(jié)果對象新軸上的重復(fù)情況。默認(rèn)允許(Flase)
- ⑨ ignore_index # 不保留連接軸上的索引,產(chǎn)生一組新的索引range
4 合并重疊數(shù)據(jù)
- 還有一種數(shù)據(jù)組合問題不能簡單的用合并和連接運(yùn)算來處理。
- Numpy的where函數(shù),用于表達(dá)一種矢量化的if-elif-else
- Series的combine_first方法,實(shí)現(xiàn)相同的功能,而且會(huì)進(jìn)行數(shù)據(jù)對齊
二 重塑和軸向旋轉(zhuǎn)
- 有許多用于重新排列表格型數(shù)據(jù)的基礎(chǔ)運(yùn)算。這些函數(shù)也稱作重塑(reshape)或軸向旋轉(zhuǎn)(pivot)運(yùn)算。
1 重塑層次化索引
- 層次化索引為DataFrame數(shù)據(jù)的重排任務(wù)提供了一種具有良好一致性的方式。主要功能有二:
- stack:將數(shù)據(jù)的列“旋轉(zhuǎn)”為行
- unstack:將數(shù)據(jù)的行“旋轉(zhuǎn)”為列
- 使用stack方法可得到一個(gè)Series,對于一個(gè)層次化的Series,unstack的方式,可以得到一個(gè)DataFrame
- 默認(rèn)情況下,stack和unstack操作的都是最內(nèi)層,傳入分層級別的編號或名稱即可對其他級別進(jìn)行unstack操作。
- 如果不是所有級別值都能在分組中找到,則返回缺失值
- stack默認(rèn)過濾缺失值,運(yùn)算可逆
- 對DataFrame進(jìn)行unstack操作時(shí),作為旋轉(zhuǎn)軸的級別將會(huì)成為結(jié)果中的最低級別。
2 將“長格式”轉(zhuǎn)換為“寬格式”
- 時(shí)間序列數(shù)據(jù)通常是以所謂的“長格式”或“堆疊格式”存儲(chǔ)在數(shù)據(jù)庫和CSV中的,關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)尤其如此。
- 一方面保存數(shù)據(jù)的完整性,
- 另一方面便于查詢支持。
- 但缺點(diǎn)是長格式的數(shù)據(jù)操作起來不輕松,可以用DataFrame中的pivot方法實(shí)現(xiàn)這個(gè)轉(zhuǎn)換。
- 前兩個(gè)參數(shù)分別用作行和列索引的列名,最后一個(gè)參數(shù)值則是用于填充DataFrame的數(shù)據(jù)列的列名。
- 如果有兩個(gè)需要重塑的數(shù)據(jù)列或者忽略最后一個(gè)參數(shù),返回的都是層次化的列。
- pivot只是一個(gè)快捷方式,用set_index創(chuàng)建層次索引,再用unstack重塑。
三 數(shù)據(jù)轉(zhuǎn)換
- 數(shù)據(jù)不僅需要重排,也需要過濾、清理以及其他的轉(zhuǎn)換等工作。
1 移除重復(fù)數(shù)據(jù)
- duplicates() 返回一個(gè)布爾型的Series,表示各行是否是重復(fù)行
- drop_duplicates() 返回一個(gè)移除了重復(fù)行的DataFrame
- 這兩個(gè)方法默認(rèn)會(huì)判斷全部列,也可以指定部分列進(jìn)行重復(fù)項(xiàng)判斷。
- duplicates() 和drop_duplicates() 默認(rèn)保留第一個(gè)出現(xiàn)的值組合,傳入take_last = True則保留最后一個(gè)。
2 利用函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換
- Series的map方法可以接受一個(gè)函數(shù)或含有映射關(guān)系的字典對象,map是一宗實(shí)現(xiàn)元素級轉(zhuǎn)換以及其他數(shù)據(jù)清理工作的便捷方式。
3 替換值
- 利用fillna方法填充缺失數(shù)據(jù)可以看做值替換的一種特殊情況,雖然map可以修改對象的數(shù)據(jù)子集,但replace提供了一種跟簡單、更靈活的方式。
- 傳入的參數(shù)也可以是字典。
4 重命名軸索引
跟Series一樣,軸標(biāo)簽也可以通過函數(shù)或映射進(jìn)行轉(zhuǎn)換,從而得到一個(gè)新對象。軸還可以就地被修改,而無需新建一個(gè)數(shù)據(jù)結(jié)構(gòu)。
data.index.map(str.upper)- 如果想要?jiǎng)?chuàng)建數(shù)據(jù)集的轉(zhuǎn)換版(而不是修改原始數(shù)據(jù)),比較實(shí)用的方法是rename
5 離散化和面元?jiǎng)澐?/h4>
- cut函數(shù)
- 為了便于分析,連續(xù)數(shù)據(jù)常常被離散化或拆分為“面元”。要實(shí)現(xiàn)這個(gè)功能,需要pandas的cut函數(shù)
- pandas返回的是一個(gè)特殊的Categorical對象。可以將其看作一組表示面元名稱的字符串,含有一個(gè)表示不同分類名稱的levels數(shù)組以及一個(gè)為年齡數(shù)據(jù)進(jìn)行標(biāo)號的labels的屬性。
- 跟區(qū)間的符號一樣,圓括號表示開端,方括號表示閉端,哪邊是閉端可以通過tight = Flase控制。
- 如果向cut傳入的面元的數(shù)量而不是確切的面元邊界,則它會(huì)根據(jù)最小值和最大值計(jì)算一個(gè)等長面元,均勻分組。
ages = [20,22,25,27,21,23,37,23,23,54,26,29]
bins = [18,25,35,60,100]
cats = pd.cut(ages,cuts)
cats
cats.labels
cats.levels
pd.cut(data,4,precision = 2)
- qcut函數(shù)
- qcut是一個(gè)非常類似于cut的函數(shù),它可以根據(jù)樣本分位數(shù)對數(shù)據(jù)進(jìn)行面元?jiǎng)澐?#xff0c;可以設(shè)置自定義的分位數(shù)(0~1之間,包含端點(diǎn))
6 檢測和過濾異常值
data[data['a'] >= 2].any(1)
data[data['a'] == 2] = 3
7 排列和隨機(jī)采樣
- 利用numpy.random.permutation函數(shù)實(shí)現(xiàn)對Series和DataFrame的列的排列工作。
8 計(jì)算指標(biāo)/啞變量
- 另一種常用于統(tǒng)計(jì)建模或機(jī)器學(xué)習(xí)的轉(zhuǎn)換方式為:將分類變量轉(zhuǎn)換為“啞變量”或“指標(biāo)矩陣”
四 字符串操作
1 字符串對象方法
- Python內(nèi)置的字符串方法
- count # 返回子串在字符串中的出現(xiàn)次數(shù)
- endswith/startswith # 如果字符串以某個(gè)后綴結(jié)尾或某個(gè)前綴開頭,返回True
- join # 將字符串用作連接到其他字符串序列的分隔符
- index # 如果在字符串中找到子串,則返回子串第一個(gè)字符所在的位置
- find # 如果在字符串中找到子串,則返回第一個(gè)發(fā)現(xiàn)的子串第一個(gè)字符所在的位置
- rfind # 如果在字符串中找到子串,則返回第一個(gè)發(fā)現(xiàn)的子串最后一個(gè)字符所在的位置
- replace # 用另一個(gè)字符串替換指定字符串
- strip、strip、lstrip # 去除空白符(包括換行符)
- split # 通過指定的分隔符將字符串拆分為一組子串
- lower、upper # 分別將字母字符轉(zhuǎn)換為大小寫
- ljust、rjust # 用空格填充字符串的空白側(cè) 以返回符合最低寬度的字符串
2 正則表達(dá)式
3 pandas中矢量化的字符串函數(shù)
五 END
總結(jié)
- 為了便于分析,連續(xù)數(shù)據(jù)常常被離散化或拆分為“面元”。要實(shí)現(xiàn)這個(gè)功能,需要pandas的cut函數(shù)
- pandas返回的是一個(gè)特殊的Categorical對象。可以將其看作一組表示面元名稱的字符串,含有一個(gè)表示不同分類名稱的levels數(shù)組以及一個(gè)為年齡數(shù)據(jù)進(jìn)行標(biāo)號的labels的屬性。
- 跟區(qū)間的符號一樣,圓括號表示開端,方括號表示閉端,哪邊是閉端可以通過tight = Flase控制。
- 如果向cut傳入的面元的數(shù)量而不是確切的面元邊界,則它會(huì)根據(jù)最小值和最大值計(jì)算一個(gè)等長面元,均勻分組。
- qcut是一個(gè)非常類似于cut的函數(shù),它可以根據(jù)樣本分位數(shù)對數(shù)據(jù)進(jìn)行面元?jiǎng)澐?#xff0c;可以設(shè)置自定義的分位數(shù)(0~1之間,包含端點(diǎn))
- count # 返回子串在字符串中的出現(xiàn)次數(shù)
- endswith/startswith # 如果字符串以某個(gè)后綴結(jié)尾或某個(gè)前綴開頭,返回True
- join # 將字符串用作連接到其他字符串序列的分隔符
- index # 如果在字符串中找到子串,則返回子串第一個(gè)字符所在的位置
- find # 如果在字符串中找到子串,則返回第一個(gè)發(fā)現(xiàn)的子串第一個(gè)字符所在的位置
- rfind # 如果在字符串中找到子串,則返回第一個(gè)發(fā)現(xiàn)的子串最后一個(gè)字符所在的位置
- replace # 用另一個(gè)字符串替換指定字符串
- strip、strip、lstrip # 去除空白符(包括換行符)
- split # 通過指定的分隔符將字符串拆分為一組子串
- lower、upper # 分別將字母字符轉(zhuǎn)換為大小寫
- ljust、rjust # 用空格填充字符串的空白側(cè) 以返回符合最低寬度的字符串
以上是生活随笔為你收集整理的【Python】merge:数据规整化:清理、转换、合并、重塑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】GroupBy:数据聚合
- 下一篇: 【Python】ime series:时