網站首頁 編程語言 正文
前言
pandas對數據框也可以像excel一樣進行數據透視表整合之類的操作。主要是針對分類數據進行操作,還可以計算數值型數據,去滿足復雜的分類數據整理的邏輯。
首先還是導入包:
import numpy as np
import pandas as pd
整理透視 pivot?
首先介紹的是最簡單的整理透視函數pivot,其原理如圖:
pivot參數:
- index:新 df 的索引列,用于分組,如果為None,則使用現有索引
- columns:新 df 的列,如果透視后有重復值會報錯
- values:用于填充 df 的列。 如果未指定,將使用所有剩余的列,并且結果將具有按層次結構索引的列
用法如下,首先生成案例數據df
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df
df.pivot(index='foo', columns='bar', values='baz')
可以看到是一一對應。簡單來說就是把foo、bar兩個分類變量整到行列名稱上去了,baz作為值
# 多層索引,可以取其中一列
df.pivot(index='foo', columns='bar') #['baz']
# 指定值
df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])
聚合透視 Pivot Table
上面的pivot只適用于一一對應的情況,如果分類變量的組合一樣,但是取值不一樣就會報錯。此時應該用Pivot Table,他默認計算相同情況的均值。
參數:
- data: 要透視的 DataFrame 對象
- values: 要聚合的列或者多個列
- index: 在數據透視表索引上進行分組的鍵
- columns: 在數據透視表列上進行分組的鍵
- aggfunc: 用于聚合的函數, 默認是 numpy.mean'''
df = pd.DataFrame({"A": ["a1", "a1", "a1", "a2", "a2","a2"],
"B": ["b2", "b2", "b1", "b1", "b1","b1"],
"C": ['c1','c1','c2','c2','c1','c1'],
"D": [1, 2, 3, 4, 5, 6]})
df
#索引a,列b使用Pivot會報錯,因為他們之間的組合有重復,要用Pivot Table,默認計算均值
pd.pivot_table(df,index='A',columns='B',values='D')
#驗證一下b1,a2這個均值5
df.loc[(df.A=='a2')&(df.B=='b1')].D.mean()
?聚合透視高級操作
pd.pivot_table(df,index=['A','B'],#指定多個索引
columns=['C'], #指定列
values='D', #數據值列
aggfunc=np.sum, #聚合函數
fill_value=0, #空值填充
margins=True #增加匯總列
)
?#多個計算方法
pd.pivot_table(df,index=['A','B'],#指定多個索引
columns=['C'], #指定列
values='D', #數據值列
aggfunc=[np.sum,np.mean,np.std]
)
交叉表crosstab()
交叉表是用于統計分組頻率的特殊透視表。簡單來說,就是將兩個或者多個列重中不重復的元素組成一個新的 DataFrame,新數據的行和列交叉的部分值為其組合在原數據中的數量
語法結構如下:
pd.crosstab(index, columns, values=None, rownames=None,colnames=None, aggfunc=None, margins=False,
margins_name: str = 'All', dropna: bool = True,normalize=False) #→ 'DataFrame'
參數說明:
index:類數組,在行中按分組的值。
columns:類數組的值,用于在列中進行分組。
values:類數組的,可選的,要根據因素匯總的值數組。
aggfunc:函數,可選,如果未傳遞任何值數組,則計算頻率表。
rownames:序列,默認為None,必須與傳遞的行數組數匹配。
colnames:序列,默認值為None,如果傳遞,則必須與傳遞的列數組數匹配。
margins:布爾值,默認為False,添加行/列邊距(小計)
normalize:布爾值,{'all','index','columns'}或{0,1},默認為False。 通過將所有值除以值的總和進行歸一化。'
生成案例數據:
df = pd.DataFrame({"A": ["a1", "a1", "a1", "a2", "a2","a2"],
"B": ["b2", "b2", "b1", "b1", "b1","b1"],
"C": ['c1','c1','c2','c2','c1','c1'],
"D": [1, 2, 3, 4, 5, 6]})
df
pd.crosstab(df['A'],df['B']) #都是分類數據,計算頻率
pd.crosstab(df['A'],df['C']) #都是分類數據
#對交叉結果進行歸一化:
pd.crosstab(df['A'], df['B'], normalize=True)
#對每列進行歸一化:
pd.crosstab(df['A'], df['B'], normalize='columns')
#聚合,指定列做為值,并將這些值按一定算法進行聚合:
pd.crosstab(df['A'], df['C'], values=df['D'], aggfunc=np.sum) #分類和數值
#邊距匯總,在最右邊增加一個匯總列:
pd.crosstab(df['A'], df['B'],values=df['D'],aggfunc=np.sum,
normalize=True,margins=True)
數據融合melt()
#df.melt() 是 df.pivot() 逆轉操作函數。簡單說就是將指定的列放到鋪開放到行上名為variable(可指定)列,值在value(可指定)列?
語法結構:
具體語法結構如下:
pd.melt(frame: pandas.core.frame.DataFrame,id_vars=None, value_vars=None,
? ? ? ? var_name='variable', value_name='value',col_level=None)
其中:
- id_varstuple:list或ndarray(可選),用作標識變量的列。
- value_varstuple:列表或ndarray,可選,要取消透視的列。 如果未指定,則使用未設置為id_vars的所有列。
- var_namescalar:用于“變量”列的名稱。 如果為None,則使用frame.columns.name或“variable”。
- value_namescalar:默認為“ value”,用于“ value”列的名稱。
- col_levelint或str:可選,如果列是MultiIndex,則使用此級別來融化。
生成案例數據:
df=pd.DataFrame({'A':['a1','a2','a3','a4','a5'],
'B':['b1','b2','b3','b4','b5'],
'C':[1,2,3,4,5]})
df
pd.melt(df)
#指定標識和值,
pd.melt(df,id_vars=['A']) #只對BC展開
pd.melt(df,value_vars=['B','C']) #保留BC,并展開
#同時指定,并命名
pd.melt(df,id_vars=['A'],value_vars=['B'],var_name='B_label',value_name='B_value')
數據堆疊 stack
#stack就是把列變量堆到行上,unstack就是行變到列上
生成案例數據 :
#堆疊 stack 單層索引:
df = pd.DataFrame({'A':['a1','a1','a2','a2'],
'B':['b1','b2','b1','b2'],
'C':[1,2,3,4],
'D':[5,6,7,8],
'E':[5,6,7,8]})
df.set_index(['A','B'],inplace=True)
df
?stack 堆疊
df.stack()
?unstack 解堆
df.stack().unstack()
df.stack().unstack().unstack()
df.stack().unstack().unstack().unstack()
?可以看到,解堆就是不停地把列變量弄到行上去作為索引。
原文鏈接:https://blog.csdn.net/weixin_46277779/article/details/126198862
相關推薦
- 2022-03-08 C++中的對象初始化操作代碼_C 語言
- 2022-06-15 Golang?gin跨域解決方案示例_Golang
- 2023-07-05 React hooks之useEffect、useMemo優化技巧
- 2023-01-02 Pytes正確的配置使用日志功能_python
- 2022-04-05 python將列表轉換為字符串(含有引號,用逗號間隔)
- 2024-03-22 【IDEA】@RequestMapping與@GetMapping、@PostMapping的區別
- 2022-12-12 Go語言開發前后端不分離項目詳解_Golang
- 2023-04-07 React?Mobx狀態管理工具的使用_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支