【Pandas】pandas DataFrame stack

Pandas2.2 DataFrame

Reshaping sorting transposing

方法描述
DataFrame.droplevel(level[, axis])用于**從 DataFrame 的索引(行或列)中刪除指定層級(level)**的方法
DataFrame.pivot(*, columns[, index, values])用于重塑 DataFrame 的結構的方法
DataFrame.pivot_table([values, index, …])用于**創建透視表(pivot table)**的函數
DataFrame.reorder_levels(order[, axis])用于重新排序多級索引(MultiIndex)的層級順序的方法
DataFrame.sort_values(by, *[, axis, …])用于按指定列或行的值對 DataFrame 進行排序的方法
DataFrame.sort_index(*[, axis, level, …])用于按索引(行或列)對 DataFrame 進行排序的方法
DataFrame.nlargest(n, columns[, keep])用于選取 DataFrame 中某列或多列的前 n 個最大值對應的行的方法
DataFrame.nsmallest(n, columns[, keep])用于選取 DataFrame 中某列或多列的前 n 個最小值對應的行的方法
DataFrame.swaplevel([i, j, axis])用于交換多級索引(MultiIndex)中兩個層級的位置的方法
DataFrame.stack([level, dropna, sort, …])用于將 DataFrame 的列索引“壓入”行索引中,從而增加行數并減少列數的方法

pandas.DataFrame.stack()

pandas.DataFrame.stack(level=-1, dropna=<no_default>, sort=<no_default>, future_stack=False) 是一個用于將 DataFrame 的列索引“壓入”行索引中,從而增加行數并減少列數的方法。它常用于將寬格式數據轉換為長格式數據,是 unstack() 的反向操作。


📌 方法簽名
DataFrame.stack(level=-1, dropna=True, sort=False, future_stack=False)

🔧 參數說明
參數類型說明
levelint、str 或 list of int/str,默認 -1(最后一級)要堆疊的列索引層級;默認只堆疊最內層
dropnabool,默認 True是否刪除結果中的 NaN
sortbool,默認 False是否對新生成的 MultiIndex 進行排序
future_stackbool,默認 False控制是否啟用未來行為(Pandas 2.0+ 中可能默認為 True)

? 返回值
  • 返回一個新的 DataFrameSeries
  • 如果堆疊后只剩一列,則返回 Series
  • 否則返回 DataFrame
  • 原始數據不會被修改。

🧪 示例代碼及結果
示例 1:基本用法(單級列索引)
import pandas as pd# 創建一個普通 DataFrame
df = pd.DataFrame({'A': [1, 2],'B': [3, 4]
}, index=['row1', 'row2'])print("Original DataFrame:")
print(df)
輸出:
      A  B
row1  1  3
row2  2  4
# stack() 將列變為行索引
stacked = df.stack()
print("\nAfter stack():")
print(stacked)
輸出:
row1  A    1B    3
row2  A    2B    4
dtype: int64

結果是一個 Series,具有多級索引。


示例 2:使用 dropna=False 保留缺失值
df_with_nan = pd.DataFrame({'A': [1, None],'B': [None, 4]
}, index=['row1', 'row2'])print("DataFrame with NaN:")
print(df_with_nan)
輸出:
       A    B
row1  1.0  NaN
row2  NaN  4.0
# 不刪除 NaN
stacked_with_nan = df_with_nan.stack(dropna=False)
print("\nAfter stack(dropna=False):")
print(stacked_with_nan)
輸出:
row1  A    1.0B    NaN
row2  A    NaNB    4.0
dtype: float64

示例 3:堆疊多級列索引(MultiIndex)
# 創建一個多級列索引 DataFrame
arrays = [['X', 'X', 'Y', 'Y'],['a', 'b', 'a', 'b']
]
columns = pd.MultiIndex.from_arrays(arrays, names=('group', 'sub'))
df_multi_col = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns=columns)print("Original Multi-column DataFrame:")
print(df_multi_col)
輸出:
group          X         Y       
sub            a  b       a  b
0              1  2       3  4
1              5  6       7  8
# 默認堆疊最內層(sub)
stacked_inner = df_multi_col.stack()
print("\nAfter stack() (inner level):")
print(stacked_inner)
輸出:
   group  X  Y
0 sub         a     X  1  3b     X  2  4
1 sub         a     X  5  7b     X  6  8

注意:此時返回的是 DataFrame,因為堆疊后仍有多列。


示例 4:指定堆疊外層索引(level=‘group’)
# 堆疊外層索引(group)
stacked_outer = df_multi_col.stack(level='group')
print("\nAfter stack(level='group'):")
print(stacked_outer)
輸出:
sub           a  bgroup              
0 X           1  2Y           3  4
1 X           5  6Y           7  8

此時 group 被壓入行索引中。


示例 5:堆疊多個層級(level=[0, 1])
# 堆疊所有層級
stacked_all_levels = df_multi_col.stack(level=[0, 1])
print("\nAfter stack(level=[0, 1]):")
print(stacked_all_levels)
輸出:
   group  sub  value
0 X   a        1X   b        2Y   a        3Y   b        4
1 X   a        5X   b        6Y   a        7Y   b        8

注意:在某些版本中會自動添加 value 列名。


示例 6:設置 sort=True 對結果排序
# 設置 sort=True
stacked_sorted = df_multi_col.stack(sort=True)
print("\nAfter stack(sort=True):")
print(stacked_sorted)
輸出(與前面類似,但索引已排序):
   group  X  Y
0 sub         a     X  1  3b     X  2  4
1 sub         a     X  5  7b     X  6  8

索引按字典序排列。


🧠 應用場景
場景說明
重塑數據結構將寬格式轉為長格式,適合后續分析或繪圖
準備時間序列數據如將不同時間點的數據合并為一列
配合 groupby 使用長格式更適合分組統計
可視化準備準備適合繪制箱線圖、折線圖等的數據格式

?? 注意事項
  • stack() 默認只堆疊最內層列索引;
  • 可通過 level 指定任意層級;
  • dropna=True 會刪除含 NaN 的行;
  • sort=True 會對新生成的 MultiIndex 排序;
  • 堆疊后如果只剩一列,結果為 Series
  • 適用于行索引(axis=0),不支持列方向堆疊;
  • future_stack=True 在 Pandas 2.0+ 中可能會成為默認行為。

? 總結對比
方法是否推薦使用說明
stack()? 推薦快速將列索引壓入行索引
stack(level='name')? 推薦使用層級名清晰直觀
stack(level=0)? 推薦快速按編號堆疊層級
stack(..., dropna=False)? 推薦保留缺失值
stack(..., sort=True)? 推薦自動排序索引

你可以根據實際需求選擇堆疊哪些層級、是否刪除缺失值、是否排序,從而靈活地將數據從“寬格式”轉換為“長格式”,便于后續分析和可視化。它是 Pandas 中非常重要的數據重塑工具之一。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87317.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 自動關閉資源語法糖 - try-with-resources

文章目錄 Java 自動關閉資源語法糖 - try-with-resources前言優勢1、自動資源管理2、處理多重資源3、異常處理更健壯4、適用條件 總結 Java 自動關閉資源語法糖 - try-with-resources 前言 日常開發中&#xff0c;我們經常會看到如下代碼&#xff1a; try (InputStream is …

MyBatis中的動態SQL是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【MyBatis中的動態SQL是什么&#xff1f;】面試題。希望對大家有幫助&#xff1b; MyBatis中的動態SQL是什么&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; MyBatis中的動態SQL指的是根據不同的條件&#x…

【Java反射】如何新增對象中的屬性,與JavaScript中的直接添加屬性有什么區別?

問&#xff1a; Object obj new Object(); //獲取一個類的class對象 Class<?> objClass Object.class; try { //通過newInstance方法創建一個新的屬性 Field newField Field.class.newInstance(); newField.setAccessible(true); newField.set(obj, “index”); }ca…

java spring boot Swagger安裝及使用

https://springdoc.org/ 可能原因分析 &#x1f50d; 原因 1&#xff1a;SpringFox 版本與 Spring Boot 版本不兼容 ? SpringFox 3.0.0 不完全兼容 Spring Boot 2.6 及更高版本&#xff0c;可能導致 NullPointerException。 Spring Boot 3.x 完全不支持 SpringFox&#xff0c…

電商云倉/前置倉的物流高效監控、管理、預警系統,快遞鳥DMS

在電商行業蓬勃發展的當下&#xff0c;電商云倉和前置倉作為物流配送體系的關鍵環節&#xff0c;其高效運作直接影響著消費者體驗與企業競爭力。快遞鳥 DMS 物流交付管理平臺&#xff0c;以其卓越的物流監控、管理及預警功能&#xff0c;成為電商企業優化云倉和前置倉物流管理的…

HarmonyOS Next深度解析:高德定位SDK高效集成與實戰指南

HarmoyOS Next 實現高德定位SDK 注&#xff1a;作者采用版本為 HarmonyOS 5.0.0 Release SDK和DevEco Studio 5.0.0 Release。 1.獲取本地AppID&#xff1a; 在index.pages的abountToAppear( ) 方法中獲取appID、并打印在Log日志&#xff0c;即可在程序運行時獲取本地項目的…

【技術】記一次 Docker 中的 ES 數據遷移,使用 Reindex API

記一次 Docker 中的 ES 數據遷移&#xff0c;使用 Reindex API 環境背景需求背景開始遷移確認老 ES 的訪問地址在新 ES 中創建索引的 Mapping (選配)在新 ES 中配置老 ES 的地址開始遷移數據數據驗證 首先聲明&#xff0c;是因為環境限制&#xff0c;沒有辦法使用同步工具&…

yii2基礎版本安裝記錄,實錄有點亂看標題即可

因為使用php 安裝的是docker環境所有進入到容器安裝ridh_mfe_api 為掛載目錄 Nginx及PHP掛載配置 因為使用php 安裝的是docker環境所有進入到容器安裝 ridh_mfe_api 為掛載目錄 進入容器 % docker exec -it php sh /var/www/html # ls index.html index.php composer crea…

前端跨域解決方案(3):CORS

1 CORS 核心 CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;即跨域資源共享&#xff0c;是目前最主流的跨域方案&#xff0c;它通過服務器返回的特殊 HTTP 頭&#xff0c;允許瀏覽器放行跨域請求。與傳統的 JSONP 相比&#xff0c;CORS 具有明顯的優…

SpringBoot源碼解析(十五):spring-boot-autoconfigure.jar的模塊化設計

前言 SpringBoot的自動配置是其革命性特性的核心&#xff0c;而spring-boot-autoconfigure.jar則是這一機制的物理載體。本文將深入剖析這個JAR包的模塊化設計哲學&#xff0c;從包結構劃分、條件注解體系到自動配置加載機制&#xff0c;全方位解析SpringBoot如何通過精妙的模…

學習筆記九:docker容器日志問題

docker容器日志問題 背景如何處理日志問題主要通過日志輪詢方式處理。修改 Docker 配置日志快速清理 背景 Docker 默認使用的是 json-file 日志驅動。日志會一直寫&#xff0c;一直寫&#xff0c;沒有限制、沒有輪轉、沒有清理&#xff01; 日志默認位置&#xff1a; /var/lib…

低成本同屏方案:電腦 + 路由器實現 50 臺安卓平板實時同屏

引言 在教育機構、小型培訓場景或企業簡易會議中&#xff0c;常面臨以最低成本實現多設備同屏的需求。本文針對 "電腦 路由器 50 臺安卓平板" 的極簡硬件組合&#xff0c;詳細剖析實時同屏的實現路徑&#xff0c;從問題分析到技術落地提供全流程解決方案&#xff0…

Unity ECS DOTS技術實現50000個cube隨機循環移動流程

前言 之前使用過ECS面向組件開發&#xff0c;一直想試一下Unity的ECS DOTS技術&#xff0c;但是苦于入門門檻太高&#xff0c;下載官方的Demo&#xff0c;發現代碼哪哪兒都看不懂&#xff0c;一大堆API聞所未聞&#xff0c;而且沒有一個入門的流程&#xff0c;導致無法進行下去…

設計模式精講 Day 3:抽象工廠模式(Abstract Factory Pattern)

【設計模式精講 Day 3】抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09; 文章簡述 在軟件開發中&#xff0c;隨著業務復雜度的提升&#xff0c;系統需要支持多種產品族的創建。抽象工廠模式正是為了解決這一問題而誕生的設計模式之一。本文作為“設計模式精講”…

Kafka消息零丟失架構設計:從原理到實戰的全方位保障

引言 在構建高可靠分布式系統時&#xff0c;Kafka作為核心消息中間件被廣泛應用于數據管道、實時流處理等關鍵場景。然而&#xff0c;分布式環境下的網絡波動、節點故障等因素可能導致消息丟失&#xff0c;如何確保Kafka實現端到端的消息零丟失成為架構設計的關鍵挑戰。本文將…

Python學習筆記:錯誤和異常處理

1. 什么是錯誤和異常 在Python中&#xff0c;錯誤可以分為兩類&#xff1a; 語法錯誤(Syntax Errors)&#xff1a;代碼不符合Python語法規則異常(Exceptions)&#xff1a;語法正確的代碼在運行時發生的錯誤 # 語法錯誤示例 print("Hello World" # 缺少右括號# 異…

為什么要進行行為驗證,行為驗證方式有哪些?

進行行為驗證的主要目的是提高賬戶安全性、防范自動化攻擊、增強用戶身份確認精準度、優化用戶體驗。其中&#xff0c;提高賬戶安全性最為關鍵。行為驗證能通過分析用戶的行為模式&#xff0c;如操作習慣、設備使用特點等&#xff0c;識別出非正常或惡意活動&#xff0c;迅速采…

主流Java Redis客戶端(Jedis、Lettuce、Redisson)差異對比

主流Java客戶端對比&#xff1a;Jedis采用阻塞I/O&#xff0c;需連接池支持&#xff1b;Lettuce/Redisson基于Netty非阻塞I/O。Jedis輕量但并發能力弱&#xff0c;Lettuce支持10K并發且為SpringBoot默認&#xff0c;Redisson提供分布式功能但性能稍遜。 Redisson Lettuce 在 …

使用Hexo搭建博客網站(二)

設置主題 我們在官方主題中選擇一個自己喜歡的主題 來到GitHub&#xff0c;將它git clone到當前項目的themes文件夾中 設置_config.yml 找到 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: landscape 只需將這個landscape名字…

springAI 大模型應用開發

一 筆記總結 1.1 spring AI 實戰 1.1.1 spring aideepseek整合 通過使用spring ai 調用大模型deepseek&#xff0c;實現對話聊天&#xff0c;文字轉圖片&#xff0c;文字轉音頻。 1.1.2 OLLAMA Ollama 專為本地部署和運行大型語言模型&#xff08;LLM&#xff09;而設計的…