Pandas转pivot, groupby等结果为dataFrame--彻底解决多表头问题
Pandas轉(zhuǎn)pivot, groupby等結(jié)果為dataFrame
問題背景:
在用Pandas進行數(shù)據(jù)分析和處理的時候,常會用到如goupby(),pivot()等方法,這些方法極大簡化了我們的操作復(fù)雜度。但另一方面,這些操作之后返回的類型往往卻并不是一個標準的DataFrame。具體的現(xiàn)象就是常會出現(xiàn)多出來的一級表頭,而當(dāng)我們想要再進行繼續(xù)處理時,它的索引方式就發(fā)生變化了,不便于我們進一步操作。因此我們希望能夠有一種方法將這些返回類型再次變?yōu)槲覀冃枰腄ataFrame類型同時保持原有的表頭。本文就這一問題進行簡單描述。
給定數(shù)據(jù)(借用一下這位朋友的數(shù)據(jù)):
import pandas as pd df= pd.DataFrame({'name': ['張三','李四','王五','張三','王五','張三','趙六','張三','趙六'],'sex': ['男','女','男','男','男','男','女','女','女'],'expense': [2.9,9.0,8.5,5.6,5.6,5.2,1.2,4.5,3.2],'income': [5.2,2.5,6.3,5.6,4.5,5.6,1.2,8.5,1.2]})df的值
dfname sex expense income 0 張三 男 2.9 5.2 1 李四 女 9.0 2.5 2 王五 男 8.5 6.3 3 張三 男 5.6 5.6 4 王五 男 5.6 4.5 5 張三 男 5.2 5.6 6 趙六 女 1.2 1.2 7 張三 女 4.5 8.5 8 趙六 女 3.2 1.2現(xiàn)在按性別統(tǒng)計他們的開銷:
df_expense = df.groupby(['sex','name'])['expense'].agg(np.mean)結(jié)果:
df_expensesex name 女 張三 4.500000李四 9.000000趙六 2.200000 男 張三 4.566667王五 7.050000 Name: expense, dtype: float64注意,此時的df_expense變成了series,因為這里我們只聚合了一列。而此時的前2列,實際上已經(jīng)變成了df_expense的index
df_expense.indexMultiIndex([('女', '張三'),('女', '李四'),('女', '趙六'),('男', '張三'),('男', '王五')],names=['sex', 'name'])那么如果直接使用to_frame()方法則不能得到我們想要的結(jié)果(即sex,name,mean_expense各為一列):
pd.DataFrame(df_expense)expense sex name 女 張三 4.500000李四 9.000000趙六 2.200000 男 張三 4.566667王五 7.050000因為此時它的index仍然是剛才那個Series類型的index。
還好Pandas實際上提供了一種機制,即重置索引。其基本原理是將每一列只要是表頭的項全部放在一起,作為一個完整的表頭名,從而實現(xiàn)將多級表頭合并為同一個表頭的效果:
df_new = pd.DataFrame(df_expense).reset_index()df_newsex name expense 0 女 張三 4.500000 1 女 李四 9.000000 2 女 趙六 2.200000 3 男 張三 4.566667 4 男 王五 7.050000再檢查一下它的表頭現(xiàn)在是哪些:
df_new.columnsIndex(['sex', 'name', 'expense'], dtype='object')這樣一來,df_new就又變回了我們想要的DataFrame類型,就方便我們操作了。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Pandas转pivot, groupby等结果为dataFrame--彻底解决多表头问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python轻量级IDE推荐 -- Ju
- 下一篇: Pandas简明教程:一、Pandas简