① python 基本操作- 數據選取loc、iloc、ix函數
loc中的數據是列名,是字元串,所以前後都要取;iloc中數據是int整型,所以是Python默認的前閉後開
構建數據集df
loc函數主要通過行標簽索引行數據 ,劃重點, 標簽!標簽!標簽!
loc[1] 選擇行標簽是1的(從0、1、2、3這幾個行標簽中)
loc[0:1] 和 loc[0,1]的區別,其實最重要的是loc[0:1]和iloc[0:1]
索引某一列數據,loc[:,0:1],還是標簽,注意,如果列標簽是個字元,比如'a',loc['a']是不行的,必須為loc[:,'a']。
但如果行標簽是'a',選取這一行,用loc['a']是可以的。
iloc 主要是通過行號獲取行數據,劃重點,序號!序號!序號!
iloc[0:1],由於Python默認是前閉後開,所以,這個選擇的只有第一行!
如果想用標簽索引,如iloc['a'],就會報錯,它只支持int型。
ix——結合前兩種的混合索引,即可以是行序號,也可以是行標簽。
如選擇prize>10(prize為一個標簽)的,即 df.loc[df.prize>10]
還有&並或等操作
python選取特定列——pandas的iloc和loc以及icol使用
pandas入門——loc與iloc函數
pandas中loc、iloc、ix的區別
pandas基礎之按行取數(DataFrame)
② Python 數據處理(二十四)—— 索引和選擇
如果你想獲取 'A' 列的第 0 和第 2 個元素,你可以這樣做:
這也可以用 .iloc 獲取,通過使用位置索引來選擇內容
可以使用 .get_indexer 獲取多個索引:
警告 :
對於包含一個或多個缺失標簽的列表,使用 .loc 或 [] 將不再重新索引,而是使用 .reindex
在以前的版本中,只要索引列表中存在至少一個有效標簽,就可以使用 .loc[list-of-labels]
但是現在,只要索引列表中存在缺失的標簽將引發 KeyError 。推薦的替代方法是使用 .reindex() 。
例如
索引列表的標簽都存在
先前的版本
但是,現在
索引標簽列表中包含不存在的標簽,使用 reindex
另外,如果你只想選擇有效的鍵,可以使用下面的方法,同時保留了數據的 dtype
對於 .reindex() ,如果有重復的索引將會引發異常
通常,您可以將所需的標簽與當前軸做交集,然後重新索引
但是,如果你的索引結果包含重復標簽,還是會引發異常
使用 sample() 方法可以從 Series 或 DataFrame 中隨機選擇行或列。
該方法默認會對行進行采樣,並接受一個特定的行數、列數,或數據子集。
默認情況下, sample 每行最多返回一次,但也可以使用 replace 參數進行替換采樣
默認情況下,每一行被選中的概率相等,但是如果你想讓每一行有不同的概率,你可以為 sample 函數的 weights 參數設置抽樣權值
這些權重可以是一個列表、一個 NumPy 數組或一個 Series ,但它們的長度必須與你要抽樣的對象相同。
缺失的值將被視為權重為零,並且不允許使用 inf 值。如果權重之和不等於 1 ,則將所有權重除以權重之和,將其重新歸一化。例如
當應用於 DataFrame 時,您可以通過簡單地將列名作為字元串傳遞給 weights 作為采樣權重(前提是您要采樣的是行而不是列)。
sample 還允許用戶使用 axis 參數對列進行抽樣。
最後,我們還可以使用 random_state 參數為 sample 的隨機數生成器設置一個種子,它將接受一個整數(作為種子)或一個 NumPy RandomState 對象
當為該軸設置一個不存在的鍵時, .loc/[] 操作可以執行放大
在 Series 的情況下,這實際上是一個追加操作
可以通過 .loc 在任一軸上放大 DataFrame
這就像 DataFrame 的 append 操作
由於用 [] 做索引必須處理很多情況(單標簽訪問、分片、布爾索引等),所以需要一些開銷來搞清楚你的意圖
如果你只想訪問一個標量值,最快的方法是使用 at 和 iat 方法,這兩個方法在所有的數據結構上都實現了
與 loc 類似, at 提供了基於標簽的標量查找,而 iat 提供了基於整數的查找,與 iloc 類似
同時,你也可以根據這些索引進行設置值
如果索引標簽不存在,會放大數據
另一種常見的操作是使用布爾向量來過濾數據。運算符包括:
|(or) 、 &(and) 、 ~ (not)
這些必須用括弧來分組,因為默認情況下, Python 會將 df['A'] > 2 & df['B'] < 3 這樣的表達式評估為 df['A'] > (2 & df['B']) < 3 ,而理想的執行順序是 (df['A'] > 2) & (df['B'] < 3)
使用一個布爾向量來索引一個 Series ,其工作原理和 NumPy ndarray 一樣。
您可以使用一個與 DataFrame 的索引長度相同的布爾向量從 DataFrame 中選擇行
列表推導式和 Series 的 map 函數可用於產生更復雜的標准
我們可以使用布爾向量結合其他索引表達式,在多個軸上索引
iloc 支持兩種布爾索引。如果索引器是一個布爾值 Series ,就會引發異常。
例如,在下面的例子中, df.iloc[s.values, 1] 是正確的。但是 df.iloc[s,1] 會引發 ValueError 。
③ Python數據分析筆記#8.2.2 索引上的合並
「目錄」
數據規整:聚合、合並和重塑
Data Wrangling: Join, Combine, and Reshape
--------> 資料庫風格的DataFrame合並
--------> 索引上的合並
上一篇筆記講的是如何根據DataFrame的列名來鏈接兩個DataFrame對象。
有時候我們要根據DataFrame中的index索引來合並數據。這種情況下,我們可以傳入 left_index=True或right_index=True 或兩個都傳入來說明索引被用作鏈接鍵。
我們先創建兩個DataFrame,指明根據第一個DataFrame的'key'列和第二個DataFrame的index索引來合並數據:
默認的merge方法是求取鏈接鍵的交集,通過傳入how='outer'可以得到它們的並集:
層次化索引數據的合並
對於層次化索引的數據的合並,我們要以 列表的形式指明用作合並鍵的多個列 。
比如下面我們就指定根據第一個DataFrame的'key1'列和'key2'列以及第二個DataFrame的index索引來合並:
同時使用雙方的索引來合並也沒問題:
join方法
DataFrame還有便捷的實例方法join,它能更方便的實現按索引合並,但要求沒有重疊的列。
我們還可以向join傳入一組DataFrame,類似於concat函數,實現多個DataFrame的合並拼接:
-END-
④ pandas將某一行設置為列索引(python)
b[b.['state']=='ohio'].index
In [36]: list(df['state']).index('ohio')
Out[36]: 0
In [37]: list(df['state']).index('nevada')
Out[37]: 1
訪問某一列可以通過b['state']和b.state這兩種方法進行,但是輸出的pandas裡面的Series這種數據類型,因此b['state'].index()返回Index([0,1], dtype=object)。
因為數據分析知某個值並不是非常重要,所以沒有直接輸出索引值的函數,可以通過query()函數,b.query('state == "obio"'),輸出含有ohio的行自然也就知道索引。
(4)python數據索引擴展閱讀:
索引是為了加速對表中數據行的檢索而創建的一種分散的存儲結構。索引是針對表而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。
在資料庫關系圖中,可以在選定表的「索引/鍵」屬性頁中創建、編輯或刪除每個索引類型。當保存索引所附加到的表,或保存該表所在的關系圖時,索引將保存在資料庫中。
在資料庫系統中建立索引主要有以下作用:
(1)快速取數據;
(2)保證數據記錄的唯一性;
(3)實現表與表之間的參照完整性;
(4)在使用ORDER by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間。
⑤ Python 數據處理(二十九)—— MultiIndex 高級索引操作
從語法上將 MultiIndex 與 .loc 集成在高級索引中是有些挑戰性。通常, MultiIndex 的鍵採用元組的形式。例如
注意 : 雖然也可以使用 df.loc['bar', 'two'] ,但這種簡寫的符號通常會導致歧義
如果你還想用 .loc 索引某一列,你必須像這樣使用一個元組
想要獲取第一個級別的某一標簽的所有元素,並不需要傳遞元組,例如
而不是使用 df.loc[('bar',),] (等價於 df.loc['bar',] )
當然,也可以進行切片
通過提供一個元組切片,選擇范圍內的值
傳遞一個標簽或元組列表的工作原理類似於 reindex
需要注意的是,在 pandas 中,當涉及到索引時,元組和列表的處理方式並不相同。
元組被解釋為一個多級鍵,而列表則用來指定多個鍵。或者換句話說,元組是橫向的,列表是縱向的
您可以通過提供多個索引器來對 MultiIndex 進行切片
可以使用 slice(None) 選擇該級別的所有內容,沒有指定索引的級別默認為 slice(None)
通常,切片的兩段都會包括在內,因為這是標簽索引
在使用 .loc 的時候,最好同時指定索引(行)和標簽(列),因為在某些情況下,傳遞的索引可能會被解析為兩個軸而不是 MultiIndex
你應該使用
而不是
例如
使用切片,列表和標簽的基本 MultiIndex 切片操作
你可以使用 pandas.IndexSlice 來讓 : 語法顯得更自然一些,而不是使用 slice(None)
可以使用這種方法在多個軸同時進行相當復雜的選擇
您可以使用布爾索引器來進行與值相關的選擇
您還可以為 .loc 指定 axis 參數,以在某一個軸上傳遞切片
此外,您可以使用以下方法設置這些值
也可以在等號右邊使用可對齊對象
DataFrame 的 xs() 方法還接受一個 level 參數,以便更容易在 MultiIndex 的特定級別上選擇數據
使用切片
您還可以為 xs 提供 axis 參數來選擇列
使用切片
xs 還允許使用多個鍵進行選擇
使用切片
您可以將 drop_level=False 傳遞給 xs ,以保留所選擇的級別
使用 drop_level=True (默認值)與上面的結果比較
在 pandas 對象的 reindex() 和 align() 方法中使用 level 參數,可以在一個級別上廣播值
swaplevel() 方法可以切換兩個級別的順序
reorder_levels() 方法是 swaplevel 方法的推廣,允許你在一個步驟中排列分層索引級別
rename() 方法可用於重命名 MultiIndex 的標簽,通常用於重命名 DataFrame 的列
rename 的 columns 參數允許指定需要重命名的列的字典
這個方法也可以用來重命名 DataFrame 主索引的特定標簽
rename_axis() 方法用於重命名 Index 或 MultiIndex 的名稱。
特別地,可以指定 MultiIndex 的級別名稱,可以使用 reset_index() 將 MultiIndex 移動到列
注意 : DataFrame 的列是一個索引,因此使用 rename_axis 和 columns 參數可以改變該索引的名稱
rename 和 rename_axis 都支持指定字典、 Series 或映射函數來將標簽/名稱映射到新值
當直接使用 Index 對象而不是通過 DataFrame 工作時,可以使用 Index.set_names() 來更改名稱
您不能通過 level 設置 MultiIndex 的名稱
使用 Index.set_names() 替代