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类型,就方便我们操作了。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要删除DataFrame多级表头,可以使用以下方法: 使用`reset_index()`方法将多级表头换为单级索引。例如,假设我们有一个具有多级表头DataFrame `df`,可以通过以下代码将其换为单级索引: ``` df = df.reset_index() ``` 此方法会将多级表头换为单级索引,并将原有的索引作为一列新的数据添加到DataFrame中。 如果要删除特定级别的表头,可以使用`columns.droplevel()`方法。该方法接受一个整数作为参数,表示要删除的表头级别。例如,如果要删除多级表头的第一级,则可以使用以下代码: ``` df.columns = df.columns.droplevel(0) ``` 此方法会将多级表头的第一级删除,并将删除后的表头赋值给DataFrame的列名。 如果只想删除特定级别的表头,而不是将其换为单级索引,可以使用`columns.set_levels()`方法。该方法接受一个列表作为参数,表示每个级别的新的标签。例如,如果要删除多级表头的第一级,则可以使用以下代码: ``` df.columns = df.columns.set_levels(['', 'New Header'], level = 0) ``` 此方法会将多级表头的第一级设置为空字符串,并将新的标签赋值给第二级表头。 需要注意的是,上述方法中的`df`是指要操作的DataFrame对象。 ### 回答2: 要删除DataFrame多级表头,可以使用pandas库中的reset_index()函数来完成操作。reset_index()函数的作用是将索引重新设置为默认的整数索引。 首先,导入pandas库并创建一个含有多级表头DataFrame。假设这个DataFrame的名称是df,它的多级表头通过使用MultiIndex对象来设置。 接下来,调用reset_index()函数来删除多级表头,并将其赋值给一个新的DataFrame。例如,可以使用df_reset = df.reset_index()来生成一个没有多级表头DataFrame。 最后,可以使用df_reset来查看删除多级表头后的DataFrame的内容。这样做可以使得DataFrame表头变为默认的整数索引,更加方便进行数据处理和分析。 总之,要删除DataFrame多级表头,只需要调用reset_index()函数即可实现。这样可以将多级表头替换为默认的整数索引,便于后续的数据操作。 ### 回答3: 删除DataFrame多级表头可以使用多种方法,以下以两种常见的方法进行回答。 方法一:使用`reset_index()`函数 `reset_index()`函数可以将多级表头变为单级表头,并重新给定列索引。 ```python import pandas as pd # 创建DataFrame多级表头 data = { ('A', 'B'): [1, 2, 3], ('C', 'D'): [4, 5, 6] } df = pd.DataFrame(data) # 删除多级表头 df.columns = df.columns.get_level_values(0) # 保留第一级表头,删除其他表头 print(df) ``` 输出结果: ``` A C 0 1 4 1 2 5 2 3 6 ``` 方法二:使用`droplevel()`函数 `droplevel()`函数可以删除指定级别的表头。 ```python import pandas as pd # 创建DataFrame多级表头 data = { ('A', 'B'): [1, 2, 3], ('C', 'D'): [4, 5, 6] } df = pd.DataFrame(data) # 删除多级表头 df.columns = df.columns.droplevel() # 删除所有级别的表头 print(df) ``` 输出结果: ``` A B 0 1 4 1 2 5 2 3 6 ``` 以上是两种常见方法,根据实际情况选择适合的方法进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值