(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_expenseindex

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)

相关推荐

  • 一起学习Python常用模块——pandas

    作者介绍 @王多鱼 百度的一名推荐算法攻城狮. 主要负责推荐的召回和排序模型的优化工作. 1 前言 Pandas 是Python的一个数据分析包,它是为了解决数据分析任务而创建的.Pandas 纳入了 ...

  • (5条消息) pandas中category类型的数据处理

    pandas中category类型的数据 用途和特点 常见的问题处理 Categorical 数据 用途和特点 category是pandas中定义的一个数据类型,相当于R中的因子.可以对特点的类型数 ...

  • (5条消息) pandas中Category的应用

    文章目录 对 Categorical 数据的一个直观认识 隐式创建 Categorical 数据 显式创建 Categorical 数据 Categoricals 是 pandas 的一种数据类型,对 ...

  • (9条消息) 十分钟搞定pandas

    原文地址:http://www.cnblogs.com/chaosimple/p/4153083.html本文是对pandas官方网站上<10 Minutes to pandas>的一个简 ...

  • (7条消息) C++中位运算的使用方法

    一:简介1 位逻辑运算符:& (位   "与")  and^  (位   "异或")|   (位    "或")   or~  (位 ...

  • (35条消息) 中国城域网路由情况介绍

    中国的城域网,大概有三张比较典型的,一个是中国移动的CMnet,一个是中国电信IP城域网,还有一个是中国网通IP城域网.作为接入最后的阵地,城域网的业务是最复杂的.含盖了IPTV,语音,Interne ...

  • (35条消息) 家用宽带网络与服务器使用的网络有什么不同?

    很多人都知道,服务器的网络跟家用网络有很多区别.其中有很多技术大牛,都是使用家里的宽带做很多别人使用公网服务器才能完成的服务. 但是对于普通人来讲,似乎都觉得没什么区别,本文就此简单做一下区分: 固定 ...

  • 怎么设置微信公众号添加关注后自动回复多条消息

    怎么设置微信公众号添加关注后自动回复多条消息

  • (40条消息) 5G网络(接入网+承载网+核心网)

    前一段时间自己一直在做某市的5G试点项目,对5G的无线接入网相关技术有了更深入的认识.因此,希望通过无线接入网为线索(行话叫锚点),帮大家梳理一下无线侧接入网+承载网+核心网的架构,这里以接入网为主, ...

  • (7条消息) 国家信息化体系六要素

    历史的温度:寻找历史背面的故事.热血和真性情作者:张玮出版社:中信出版集团股份有限公司好评:100% 销售量:0 ¥34.3 历史的温度2:细节里的故事.彷徨和信念作者:张玮出版社:中信出版集团股份有 ...