pandas之表的長寬轉換


表格的長寬轉換

表格長寬轉換也是一種透視表操作

  • df.pivot()
    • 將 一張長表 轉為 多張寬表
  • pd.melt()
    • 將 多張寬表 轉為 一張長表

二者互為逆操作


pivot和pivot_table的區別

  • pivot轉換后,如果表索引有重復值會直接出錯
  • pivot_table轉換后,如果表索引有重復值會聚合為一個輸出,不會出錯
    • 如果數據不重復,pivot_table得到的結果和pivot一致
    • pivot_table更常用
df_test = pd.DataFrame({
    'foo': ['one','one','one','two','two','two'],
    'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
    'baz': [1, 2, 3, 4, 5, 6]
})
df_test.pivot(index='foo', columns='bar', values='baz')  # 不帶聚合
df_test.pivot_table(index='foo', columns='bar', values='baz')  # 帶聚合,推薦

df_test = pd.DataFrame({
    'foo': ['one','one','one','one','two','two'],
    'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
    'baz': [1, 2, 3, 4, 5, 6]
})
df_test.pivot_table(index='foo', columns='bar', values='baz')
# df_test.pivot(index='foo', columns='bar', values='baz')  # 不帶聚合,重復即出錯(長寬表格轉換)
總結:
重復指index,columns一致



將“長格式”旋轉為“寬格式”:pivot()
將一列拆分為多列

1列值做行索引
1列值做列索引
剩下的值做表格值
多個時間序列數據通常是以所謂的“長格式”(long)或“堆疊格式”(stacked)存儲在數據庫和CSV中的
ldata = pd.read_csv('examples/pivot.csv', parse_dates=['date'])
ldata[:14]  # 1年,4個季度,3個指標,共12條數據
date	item	value	value2
0	1959-03-31	realgdp	2710.349	-0.492362
1	1959-03-31	infl	0.000	0.938709
2	1959-03-31	unemp	5.800	-1.249725
3	1959-06-30	realgdp	2778.801	-1.299523
4	1959-06-30	infl	2.340	-0.601390
5	1959-06-30	unemp	5.100	0.958452
6	1959-09-30	realgdp	2775.488	-1.239327
7	1959-09-30	infl	2.740	0.908910

# pivot()前兩個參數是行和列索引,最后一個可選參數是需要拆分的列
ldata.pivot('date', 'item', 'value').head()
# 如果不加第三個參數,就會分拆除行、列索引外的所有列,大概率返回3維dataframe
ldata.pivot('date', 'item').head()
ldata.pivot('date', 'item')['value'].head()  # 同上


用分組聚合(groupby)和重塑(unstack)一般可以實現所有數據重塑功能
不使用新學的pivot方法,
將1天變成一行,item類別從1列變成3列
# 先把要選擇的列變為行索引 兩種方式
# 1 分組聚合重塑,min()用來保留原值的
ldata.groupby(['date', 'item'])['value'].min().unstack().head()  # 這里聚合運算返回的直接是原值
# 方法2,類似分組聚合
ldata.groupby(['date', 'item']).min().head()  # 分組聚合的方式
ldata.set_index(['date', 'item']).head()  # 將這兩列轉為行索引,效果同上
ldata.set_index(['date', 'item']).unstack()['value'].head()

將“寬格式”旋轉為“長格式”

將多列合並為1列

pivot的逆運算是pandas.melt

它不是將一列轉換到多個新的DataFrame,而是合並多個列成為一個,產生一個比輸入長的DataFrame

df2 = pd.DataFrame({'key': ['foo', 'bar', 'baz'], 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
# 可看性不好
dfx = pd.melt(df2)  # 將無論多少列轉為2列,1列是原列索引,1列是原值

當使用pandas.melt,最好指明哪些列是分組指標
指定key列是唯一分組指標,其它列是數據值
melted = pd.melt(df2, ['key'])
xxx = melted.pivot('key', 'variable', 'value').reset_index()  # reset_index()將行索引轉為普通列,set_index()普通列轉為行索引
xxx.columns.name = ''  # 去除列索引name

# 還可以指定哪些列參與合並
pd.melt(df2, ['key'])
pd.melt(df2, ['key'], value_vars=['A', 'B'])  # 沒有c

pandas.melt可以不用分組指標
pd.melt(df2, value_vars=['A', 'B'])

綜合練習:同時指定多個分組指標,和參與列
pd.melt(df2, ['key','A'])  # 指定多個分組指標
pd.melt(df2, ['key','A'], value_vars=['B'])  # 指定多個分組指標和參與列

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM