數據處理python
A. python 數據處理(二十八)—— MultiIndex 分層索引
本節將介紹使用多級索引(分層索引)和其他高級索引技巧
分層或多級次索引的存在是非常有意義的,因為它打開了復雜的數據分析和操作的大門,特別是處理高維數據
從本質上講,它允許您在較低維度的數據結構包括 Series(1d) 和 DataFrame(2d) 中存儲和操作任意維度的數據
在本節中,我們將展示分層索引的確切含義,以及如何結合前面介紹的所有 pandas 索引功能使用
在 0.24.0 版本之後, MultiIndex.label 重命名為 MultiIndex.codes 。 MultiIndex.set_labels 重命名為 MultiIndex.set_codes .
MultiIndex 對象是標准 Index 對象的分層模式,它通常在 pandas 對象中存儲軸標簽
你可以把 MultiIndex 看成一個元組數組,其中每個元組都是唯一的。 MultiIndex 有如下創建方式
當傳遞給 Index 構造函數一個元組列表時,它將嘗試返回一個 MultiIndex 。
下面的示例演示了初始化 MultiIndex 的不同方法。
當你想要對兩個可迭代對象中的每個元素進行兩兩配對時,可以使用 MultiIndex.from_proct()
您也可以使用 MultiIndex.from_frame() 方法直接從 DataFrame 中構造一個 MultiIndex 。
為了方便起見,你可以直接將數組列表傳遞給 Series 或 DataFrame 的 index 參數來自動構造一個 MultiIndex
所有的 MultiIndex 構造函數都接受一個 name 參數,該參數存儲索引級別的名稱。如果沒有設置,則值為 None
索引可以放在任何軸上,索引的層級也可以隨你設置
這已經簡化了較高層次的索引,使控制台的輸出更容易看清。
注意 ,索引的顯示方式可以通過 pandas.set_options() 中的 multi_sparse 選項來控制。
值得注意的是,將元組用作軸上的原子標簽也是可以的
多索引之所以重要,是因為它允許您執行分組、選擇和重塑操作,我們將在下面以及後續部分中描述這些操作
get_level_values() 方法能夠返回特定級別的標簽向量
分級索引的一個重要特性是,您可以通過標識數據中的子組的部分標簽來選擇數據
部分選擇以一種完全類似於在常規 DataFrame 中選擇列的方式,返回的結果會 "降低" 分層索引的級別
MultiIndex 會保留索引的所有已經定義了的級別,盡管它們實際上可能並沒有被使用。
在對索引進行切片時,您可能會注意到這一點。例如
這樣做的目的是為了避免重新計算級別,以提高切片的性能。如果你只想看某一級別,可以使用 get_level_values() 方法
可以使用 remove_unused_levels() 方法重構 MultiIndex
在具有 MultiIndex 的不同索引對象之間的操作會自動對齊
Series/DataFrames 的 reindex() 方法可以傳入一個 MultiIndex ,甚至可以是一個元組列表或元組數組
B. python數據處理是什麼意思
python數據處理的意思:
python將數據進行解析,提出並存儲的過程叫做數據處理。
例如:使用「requests.get()」函數獲取嗶哩嗶哩的網頁信息,用xpath提取出目錄標簽,然後將目錄標簽保存
示例代碼如下:
執行結果如下:
更多Python知識,請關註:Python自學網!!
C. 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 。
D. Python處理大數據的技巧, 2022-06-21
(2022.06.21 Tues)
收集整理了Python處理大量數據的方法,基於Pandas,Numpy等數據處理工具。
用df的 info 方法並指定 memory_usage='deep' 參數,或使用df的 memory_usage 方法,並指定 deep=True 參數。
在讀取數據文件的方法中加入 nrows 參數選擇前n行數據讀取。
也可以跳過m行之後,讀取從m行開始的n行
當然也可以在 skiprows 選項中指定范圍,保留headers,即保留列名
可以指定 skiprows 中需要忽略的行,用list或array導入即可。下面是隨機
如果在這個指令中忽略 nrows=10 指令,則讀取跳過100行之後的所有數據。
預先指定讀入的列,縮小載入范圍
不同的數據類型佔用了不同大小的空間,對於尚未讀取的數據,可以提前指定類型( dtype );對於已經讀入的數據,通過 astype 方法修改成占空間更小的數據類型。
在讀入數據之前,通過字典指定每列對應的數據類型,讀入之後按照此類型顯示數據。
通過改變數據類型減少空間的案例。修改DataFrame d 中的一列 Sctcd ,注意到該列的數據都是1、2、0,而保存類型是object,果斷改成 uint8 ,通過 df.info(memory_usage='deep') 方法對比內存的使用情況。僅僅修改了一個列的類型,數據大小減小3MB。
一個特殊而高效的案例是當某一列的值只有有限個,不管是int還是string格式,且該列unque值遠小於列的長度,可以將該列轉變為 category 類,將節省大量空間。這么做當然也有代價,比如轉換成 category 類的數據將無法做max/min等運算,由數字轉換成的 category 也不能進行數值運算。這種轉換對內存的節省效果顯著,下面是對比。 dcol 只有兩列, Stkcd 和 Stknme ,查看unique的個數與總長度,顯示unique遠小於總長度,分別轉換為 category 類型,內存節省超過90%!
通過Pandas的 read_csv 方法中的 chunksize 選項指定讀取的塊大小,並迭代地對讀取的塊做運算。
1 https冒號//www點dataquest點io/blog/pandas-big-data/
2 CSDN - python 處理大量數據_如何用python處理大量數據
2 How to Work with BIG Datasets on 16G RAM (+Dask), on kaggle
E. 數據分析 為什麼用python
究其原因,主要有以下幾點:
①Python的語法簡單,代碼可讀性高,易於上手,有利於初學者學習;當我們處理數據時,我們希望使數據數字化並將其轉換為計算機可以操作的數字形式。我們可以直接使用一個行列表推導來完成,這非常簡單。
②Python在數據分析和交互,探索性計算和數據可視化方面擁有非常成熟的庫和活躍的社區,這使Python成為數據任務處理的重要解決方案。在數據處理和分析方面,Python具有numpy,pandas,Matplotlib,scikit-learn,IPython和其他出色的庫和工具,尤其是pandas在數據處理方面具有絕對優勢。
③Python具有很強的通用編程能力,這與別的編程語言不同。Python不僅在數據分析方面功能強大,而且在爬蟲,web,運維甚至游戲等領域也發揮著非常重要的作用。公司只需一項技術即可完成所有服務,這有利於業務整合並可以提高工作效率。
④Python是人工智慧的首選編程語言。在人工智慧時代,Python已成為最受歡迎的編程語言。得益於Python語法簡潔,豐富的庫和社區,大多數深度學習框架都優先支持Python語言。
F. Python 數據處理(三十五)—— 文本數據處理
在 pandas 中,存儲文本主要有兩種方式
但一般建議使用 StringDtype 類型存儲文本數據。都是由於各種原因,現在字元串數據的默認存儲類型還是 object 。
要存儲為 string 類型,需要顯式的設置 dtype 參數
或者在創建 Series 或 DataFrame 之後,使用 astype 轉換類型
也可以使用 StringDtype/"string" 轉換其他非字元串類型的數據
轉換現有數據的類型
StringDtype 類型對象與 object 類型之間存在一些差異
兩個結果的輸出都是 Int64 類型。將其與 object 類型比較
當存在 NA 值時,輸出為 float64 。類似地,對於返回布爾值的方法
Series 和 Index 有一套字元串處理方法,可以方便地對數組的每個元素進行操作,最重要的是,這些方法會自動忽略缺失值。
這些方法可以通過 str 屬性訪問,通常具有與內置字元串方法相匹配的名稱
Index 上的字元串方法對於清理或轉換 DataFrame 的列特別有用。
例如,您可能有帶有前導或後置空格的列
因為 df.columns 是一個 Index 對象,所以我們可以使用 .str 訪問器
我們可以根據需要對列名進行處理,然後重新設置列名。
例如,我們刪除列名的前後空格,並將其改為小寫字母,同時用 _ 替換剩餘的空格
split 方法會返回一個值為 list 的 Series
可以使用 get 或 [] 訪問拆分後的列表中的元素
更簡單的方法是設置 expand 參數,返回一個 DataFrame
當原來的 Series 包含 StringDtype 類型的數據時,輸出列也將全部為 StringDtype
當然,也可以設置切割次數
它還有個對應的 rsplit 方法,從右邊起始對字元串進行拆分
replace 參數支持使用正則表達式,前兩個參數是 pat (匹配模式) 和 repl (替換字元串)
如果只是想要替換字元串字面值,可以將 regex 參數設置為 False ,而不需要對每個特殊字元進行轉義。此時 pat 和 repl 參數必須是字元串
此外, replace 方法還接受一個可調用的替換函數,會使用 re.sub() 方法在每個匹配的模式上調用該函數
該函數需要傳入一個正則對象作為位置參數,並返回一個字元串。例如
replace 方法的 pat 參數還接受 re.compile() 編譯的正則表達式對象。所有的 flags 需要在編譯正則對象時設置
如果在 replace 中設置 flags 參數,則會拋出異常
有幾種方法可以將一個 Series 或 Index 與自己或其他的 Series 或 Index 相連接,所有這些方法都是基於 cat() 方法
可以連接一個 Series 或 Index 的內容
如果未指定 sep 參數,則默認為空字元串
默認會跳過缺失值,也可以使用 na_rep 指定缺失值的表示方式
cat() 的第一個參數 others 可以是類似列表的對象,但是其長度需要和調用對象一致
只要兩個對象中存在缺失值,對應的結果中也是缺失值,除非指定了 na_rep
others 參數也可以是二維的,但是得保證其行數必須與調用的對象一致
對於 Series 或 DataFrame 的連接,可以通過設置 join 參數指定對齊方式
通常 join 可選范圍為: 'left' , 'outer' , 'inner' , 'right' 。此時,不再要求兩個對象長度一致
當 others 參數是 DataFrame 時,也可以使用
可以將一些類似數組的對象(如 Series , Index 等)放在一個類似列表的容器中,然後傳遞給 cat
對於沒有索引的對象,其長度必須與調用 cat 的對象相同。但是 Series 和 Index 可以是任意的,除非設置了 json=None 。
如果在 others 參數上包含不同索引的對象,且設置了 join='right' ,則最後的結果將會是這些索引的並集
G. Python 適合大數據量的處理嗎
python可以處理大數據,python處理大數據不一定是最優的選擇。適合大數據處理。而不是大數據量處理。 如果大數據量處理,需要採用並用結構,比如在hadoop上使用python,或者是自己做的分布式處理框架。
python的優勢不在於運行效率,而在於開發效率和高可維護性。針對特定的問題挑選合適的工具,本身也是一項技術能力。
Python處理數據的優勢(不是處理大數據):
1. 異常快捷的開發速度,代碼量巨少
2. 豐富的數據處理包,不管正則也好,html解析啦,xml解析啦,用起來非常方便
3. 內部類型使用成本巨低,不需要額外怎麼操作(java,c++用個map都很費勁)
4. 公司中,很大量的數據處理工作工作是不需要面對非常大的數據的
5. 巨大的數據不是語言所能解決的,需要處理數據的框架(hadoop, mpi)雖然小眾,但是python還是有處理大數據的框架的,或者一些框架也支持python。
(7)數據處理python擴展閱讀:
Python處理數據缺點:
Python處理大數據的劣勢:
1、python線程有gil,通俗說就是多線程的時候只能在一個核上跑,浪費了多核伺服器。在一種常見的場景下是要命的:並發單元之間有巨大的數據共享或者共用(例如大dict)。
多進程會導致內存吃緊,多線程則解決不了數據共享的問題,單獨的寫一個進程之間負責維護讀寫這個數據不僅效率不高而且麻煩
2、python執行效率不高,在處理大數據的時候,效率不高,這是真的,pypy(一個jit的python解釋器,可以理解成腳本語言加速執行的東西)能夠提高很大的速度,但是pypy不支持很多python經典的包,例如numpy。
3. 絕大部分的大公司,用java處理大數據不管是環境也好,積累也好,都會好很多。
參考資料來源:網路-Python
H. Python 數據處理(三十九)—— groupby(過濾)
filter 方法可以返回原始對象的子集.
例如,我們想提取分組內的和大於 3 的所有分組的元素
filter 的參數必須是一個函數,函數參數是每個分組,並且返回 True 或 False
例如,提取元素個數大於 2 的分組
另外,我們也可以過濾掉不滿足條件的組,而是返回一個類似索引對象。在這個對象中,沒有通過的分組的元素被 NaN 填充
對於具有多列的 DataFrames ,過濾器應明確指定一列作為過濾條件
在進行聚合或轉換時,你可能想對每個分組調用一個實例方法,例如
但是,如果需要傳遞額外的參數時,它會變得很冗長。我們可以直接使用分派到組對象上的方法
實際上這生成了一個函數包裝器,在調用時,它接受所有傳遞的參數,並在每個分組上進行調用。
然後,這個結果可以和 agg 和 transform 結合在一起使用
在上面的例子中,我們按照年份分組,然後對每個分組中使用 fillna 補缺失值
nlargest 和 nsmallest 可以在 Series 類型的 groupby 上使用
對分組數據的某些操作可能並不適合聚合或轉換。或者說,你可能只是想讓 GroupBy 來推斷如何合並結果
我們可以使用 apply 函數,例如
改變返回結果的維度
在 Series 上使用 apply 類似
對於之前的示例數據
假設,我們想按 A 分組並計算組內的標准差,但是 B 列的數據我們並不關心。
如果我們的函數不能應用於某些列,則會隱式的刪除這些列,所以
直接計算標准差並不會報錯
可以使用分類變數進行分組,分組的順序會按照分類變數的順序
可以使用 pd.Grouper 控制分組,對於如下數據
可以按照一定的頻率對特定列進行分組,就像重抽樣一樣
可以分別對列或索引進行分組
類似於 Series 和 DataFrame ,可以使用 head 和 tail 獲取分組前後幾行
在 Series 或 DataFrame 中可以使用 nth() 來獲取第 n 個元素,也可以用於獲取每個分組的某一行
如果你要選擇非空項,可以使用關鍵字參數 dropna ,如果是 DataFrame ,需要指定為 any 或 all (類似於 DataFrame.dropna(how='any|all') )
與其他方法一樣,使用 as_index=False 分組名將不會作為索引
你也可以傳入一個整數列表,一次性選取多行
使用 cumcount 方法,可以查看每行在分組中出現的順序
可以使用 ngroup() 查看分組的順序,該順序與 cumcount 的順序相反。
注意 :該順序與迭代時的分組順序一樣,並不是第一次觀測到的順序
I. Python數據處理:篩選、統計、連表、拼接、拆分、缺失值處理
file1_path ='E:/Users/lenovo/Desktop/中視/622召回.csv' # 源數據
格式:file1=pd.read_csv(file1_path)
pd.read_csv(file1_path,encoding='gbk')
pd.read_csv(file1_path,encoding='gbk',skiprows=[2,3])
pd.read_csv(file1_path,encoding='gbk',skiprows=lambda x:x%2==1)
pd.read_csv(file1_path,encoding='gbk',keep_default_na=False)
new=pd.DataFrame()
new.new[[0,1,2]]
new.new[0:2]
查詢結果同上
new.loc[new['激活數']>1000]
loc和iloc的區別:
loc:純標簽篩選
iloc:純數字篩選
#篩選出new的某兩列
new=new.loc[:,['phone','收件人姓名']]
#篩選new的第0,1列
new.iloc[:,[0,1]]
使用『==』篩選-篩查「崔旭」的人(只能篩查指定明確的)
#new=file1.loc[(file1['收件人姓名']=='崔旭')|(file1['收件人姓名']=='崔霞')]
#print(new)
#使用loc函數篩選-str.contains函數-篩查名字中包含'亮'和'海'的人
#new=file1.loc[file1['收件人姓名'].str.contains('亮|海')]
#print(new)
#使用loc函數篩選-str.contains函數-篩查'崔'姓的人
#new=file1.loc[file1['收件人姓名'].str.startswitch('崔')]
#print(new)
df = df[(df['DEPOSIT_PAY_TIME_x'] .notnull() ) & (df['DEPOSIT_PAY_TIME_x'] != "" )]
print("ring_time(number)=0的個數:",newdata[newdata['ring_time(number)'] ==0].count()['ring_time(number)'])
print("ring_time(number)=1,2,3的個數:",newdata[(newdata['ring_time(number)'] >0) & (newdata['ring_time(number)'] <4)].count()['ring_time(number)'])
print(newdata[newdata['ring_time(number)'] ==0])
newdata[newdata['Team']. isin (['England','Italy','Russia'])][['Team','Shooting Accuracy']]
df.年齡.value_counts()
1.修改指定位置數據的值(修改第0行,』創建訂單數『列的值為3836)
new.loc[0,'創建訂單數']=3836
2.替換『小明』-『xiaoming』
df.replace({'name':{'小明':'xiaoming'}})
3.批量替換某一列的值(把『性別』列里的男-male,女-felmale)
方法一:df['性別']=df['性別'].map({'男':'male','女':'female'})
方法二:df['性別'].replace('female','女',inplace=True)
或df['性別']=df['性別'].replace('female','女') 這就是inplace的作用
+df['性別'].replace('male','男',inplace=True)
4.替換列索引
df.columns=['sex','name','height','age']
或者:df.rename(columns={'性別':'sex','姓名':'name','身高':'height','年齡':'age'})
5.刪除某一列
del df['player']
6. 刪除某一列(方法二),刪除某一行(默認axis=0刪除行,為1則刪除列)
刪除某一列(方法二)
df.drop('性別',axis=1)
刪除某一行
df.drop(1,axis=0)
file1=pd.read_csv(file1_path)
file2=pd.read_csv(file2_path)
new1=pd.DataFrame()
new1['phone']=file1['phone']
new1['contact_time']=file1['contact_time']
new2=pd.DataFrame()
new2['phone']=file2['phone']
new2['submission_audit_time']=file2['提交審核時間']
newdata=pd.merge(new1,new2,on='phone',how='left')
df=pd.concat([df1,df2],axis=0)
4.2.2 橫向表連接
df=pd.concat([df1,df2],axis=1)
df1['地區'].str.split('·',3,expand=True)
df1:
df1[['城市', '城區','地址']] = df1['地區'].str.split('·', 3, expand = True)
5.1 缺失值刪除
data.dropna(axis=0,subset = ["Age", "Sex"]) # 丟棄『Age』和『Sex』這兩列中有缺失值的行
data.dropna(how = 'all') # 傳入這個參數後將只丟棄全為缺失值的那些行
data.dropna(axis = 1) # 丟棄有缺失值的列(一般不會這么做,這樣會刪掉一個特徵)
data.dropna(axis=1,how="all") # 丟棄全為缺失值的那些列
5.2 缺失值填充:pandas.DataFrame.fillna()函數
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
功能:使用指定方法填充NA/NaN值
其中inplace=True就是直接在原有基礎上填滿
5.3 缺失值查詢:
缺失值數量查詢:df.isnull().sum()
缺失值行查詢:df[df.isnull().T.any()]
newdata['ring_time']=pd.to_datetime(newdata['submission_audit_time'])-pd.to_datetime(newdata['contact_time'])
newdata['ring_time(number)']=(pd.to_datetime(newdata['submission_audit_time'])-pd.to_datetime(newdata['contact_time'])).apply(lambda x: x.days)
new=pd.DataFrame()
new=newdata[newdata['ring_time(number)'] ==0]
new.to_csv(save_path,encoding='utf-8-sig')
將數據按行拆分並存儲到不同的csv文件中:
path='C:/Users/EDZ/Desktop/工作/2021.08.19/'
for i in range(0,30):
df.loc[[i]].to_csv(path+str(i)+'.csv',encoding='gbk')
df = df[['購葯日期', '星期','社保卡號','商品編碼', '商品名稱', '銷售數量', '應收金額', '實收金額' ]]
J. 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() 替代