(6条消息) Pandas转pivot, groupby等结果为dataFrame
Pandas转pivot, groupby等结果为dataFrame
问题背景:
在用Pandas进行数据分析和处理的时候,常会用到如goupby(),pivot()
等方法,这些方法极大简化了我们的操作复杂度。但另一方面,这些操作之后返回的类型往往却并不是一个标准的DataFrame
。具体的现象就是常会出现多出来的一级表头,而当我们想要再进行继续处理时,它的索引方式就发生变化了,不便于我们进一步操作。因此我们希望能够有一种方法将这些返回类型再次变为我们需要的DataFrame
类型同时保持原有的表头。本文就这一问题进行简单描述。
给定数据(借用一下这位朋友的数据):
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
的值
df
name 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
现在按性别统计他们的开销:
df_expense = df.groupby(['sex','name'])['expense'].agg(np.mean)
结果:
df_expense
sex name
女 张三 4.500000
李四 9.000000
赵六 2.200000
男 张三 4.566667
王五 7.050000
Name: expense, dtype: float64
注意,此时的df_expense
变成了series
,因为这里我们只聚合了一列。而此时的前2列,实际上已经变成了df_expense
的index
df_expense.index
MultiIndex([('女', '张三'),
('女', '李四'),
('女', '赵六'),
('男', '张三'),
('男', '王五')],
names=['sex', 'name'])
那么如果直接使用to_frame()
方法则不能得到我们想要的结果(即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
实际上提供了一种机制,即重置索引。其基本原理是将每一列只要是表头的项全部放在一起,作为一个完整的表头名,从而实现将多级表头合并为同一个表头的效果:
df_new = pd.DataFrame(df_expense).reset_index()
df_new
sex name expense
0 女 张三 4.500000
1 女 李四 9.000000
2 女 赵六 2.200000
3 男 张三 4.566667
4 男 王五 7.050000
再检查一下它的表头现在是哪些:
df_new.columns
Index(['sex', 'name', 'expense'], dtype='object')
这样一来,df_new
就又变回了我们想要的DataFrame
类型,就方便我们操作了。
赞 (0)