分享

Pandas转pivot, groupby等结果为dataFrame...

 优雅野人 2021-08-02

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多