pandas:reset_index及set_index的解释

本文详细介绍Pandas库中DataFrame的set_index与reset_index函数的使用方法,包括参数解析及实例演示,帮助读者掌握如何高效地对数据进行索引设置与重置。
部署运行你感兴趣的模型镜像

目录

1、pandas.DataFrame.set_index

2、pandas.DataFrame.reset_index


1、pandas.DataFrame.set_index

  • 函数原型:
DataFrame.set_index(self, keys, drop=True, append=False, inplace=False, verify_integrity=False)
  • 作用:

使用现有列设置DataFrame索引,即使用一个或多个现有的列或数组(正确的长度)设置DataFrame索引(行标签)。索引可以替换现有索引或在其上展开。——看不懂?没关系,先记着,看下例子就知道了。

  • 对常用参数的理解:

(参考官网:https://pandas.pydata.org/pandasdocs/stable/reference/api/pandas.DataFrame.set_index.html#pandas.DataFrame.set_index)

keyslabel or array-like or list of labels/arrays

需要进行set操作的单个或多个列名。

This parameter can be either a single column key, a single array of the same length as the calling DataFrame, or a list containing an arbitrary combination of column keys and arrays. Here, “array” encompasses Series, Index, np.ndarray, and instances of Iterator.

dropbool, default True

是否删除将被作为新index的列。

Delete columns to be used as the new index.

  • 举几个栗子说明:

0、首先我们简单了解下pandas的DataFrame的数据结构,如下表所示。target1、target2代表目标(target),即数据所属的类别。label代表target的标签,也可以理解为target名,这部分可以没有。attribute1~attribute3为属性,即目标所具有的属性类别。1~6为数据内容。

DataFrame的结构
 attribute1attribute2attribute3
(label)   
target1123
target2456

1、构造数据:

import pandas as pd
import numpy as np
df = pd.DataFrame({'month': [1, 4, 7, 10],
                   'year': [2012, 2014, 2013, 2014],
                   'sale': [55, 40, 84, 31]})
print(df)
"""------------------结果----------------------"""
   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2014    31

2、将索引设置为“month”列:

df2 = df.set_index('month')
print(df2)
"""------------------结果----------------------"""
       year  sale
month
1      2012    55
4      2014    40
7      2013    84
10     2014    31

3、将索引设置为“month”列,同时设置drop=False:

df5 = df.set_index('month', drop=False)
print(df5)
"""------------------结果----------------------"""
       month  year  sale
month
1          1  2012    55
4          4  2014    40
7          7  2013    84
10        10  2014    31

4、使用列'year'和'month'创建一个MultiIndex :

df3 = df.set_index(['year', 'month'])
print(df3)
"""------------------结果----------------------"""
            sale
year month
2012 1        55
2014 4        40
2013 7        84
2014 10       31

5、使用一个index和column创建一个MultiIndex :

df4 = df.set_index([pd.Index([1, 2, 3, 4]), 'year'])
print(df4)
"""------------------结果----------------------"""
        month  sale
  year
1 2012      1    55
2 2014      4    40
3 2013      7    84
4 2014     10    31

2、pandas.DataFrame.reset_index

  • 函数原型:
DataFrame.reset_index(self, level = None, drop = False, inplace = False, col_level = 0, col_fill = '') 
  • 作用:

官方解释:重置索引(index)或索引的一个级别(level)。重置DataFrame的索引,并使用默认索引。如果DataFrame有一个多索引,此方法可以删除一个或多个级别。—— 看完有点懵是吧。。。。。。我也是hhh,下面是通俗点的:

从函数的字面意思上讲就是重置索引的作用,通俗点说,还就是这么个意思!具体点儿呐?比如我们在使用随机森林的过程中,需要对原始数据进行随机抽样来组成新的样本数据,但此时都得到的样本数据在顺序上来看会有点乱,另外数据看上去也不会太整齐。利用该函数可以使数据得到重新排列并看起来更加整齐。该函数常用于在数据重组过后,对数据重新设置连续行索引。

  • 对常用参数的理解(对于这些参数下面会有具体的例子):

levelint, str, tuple, or list, default None

只从索引(index)中删除给定的级别(level)。默认移除所有级别。

dropbool, default False

是否将索引重置为默认整数索引。即在新增整数索引时是否删除原来的索引。

1、首先创建DataFrame,创建的DataFrame的index均为字符串:

import pandas as pd
import numpy as np
df = pd.DataFrame([('bird', 389.0),
                   ('bird', 24.0),
                   ('mammal', 80.5),
                   ('mammal', np.nan)],
                  index=['falcon', 'parrot', 'lion', 'monkey'],  # index是:猎鹰、鹦鹉、狮子、猴子
                  columns=('class', 'max_speed'))
print(df)
"""---------------运行结果---------------"""
         class  max_speed
falcon    bird      389.0
parrot    bird       24.0
lion    mammal       80.5
monkey  mammal        NaN

2、当我们重置索引时,此时默认drop=False,旧index被添加为一列,并使用一个新的连续index。注意结果与原来数据的区别,原数据的index被视为一个新的列并添加列名index,同时添加了一个新的索引0~3。

df1 = df.reset_index()
print(df1)
"""-------------运行结果-------------"""
    index   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal        NaN

3、我们可以设置drop=True来避免旧索引被添加为列,即在新增整数索引前删除旧索引。从结果看出,drop=True时直接将原有的index去掉,添加新的顺序索引。

df2 = df.reset_index(drop=True)
print(df2)
"""--------------运行结果----------------"""
    class  max_speed
0    bird      389.0
1    bird       24.0
2  mammal       80.5
3  mammal        NaN

4、另外,在MultiIndex的情况如下。我们重新构造多索引数据,index的label分别为‘class’与‘name’,注意,这里的index label不是列名。列名分别为speed_max和species_type。可以看出,多索引的数据结构看起来不是那么的整齐。

index = pd.MultiIndex.from_tuples([('bird', 'falcon'),
                                   ('bird', 'parrot'),
                                   ('mammal', 'lion'),
                                   ('mammal', 'monkey')],
                                  names=['class', 'name'])
columns = pd.MultiIndex.from_tuples([('speed_max',), ('species_type',)])
df3 = pd.DataFrame([(389.0, 'fly'),
                   ( 24.0, 'fly'),
                   ( 80.5, 'run'),
                   (np.nan, 'jump')],
                  index=index,
                  columns=columns)
print(df3)
"""-------------------运行结果---------------------"""
              speed_max species_type
class  name
bird   falcon     389.0          fly
       parrot      24.0          fly
mammal lion        80.5          run
       monkey       NaN         jump

5、接下来我们可以使用 reset_index来看下效果。这里将index label重置为列名,并将index作为新增的列存留。在重置索引之后相比原始数据是不是起码看着就很舒服了。

df4 = df3.reset_index()
print(df4)
"""-----------------运行结果---------------------"""
    class    name speed_max species_type
0    bird  falcon     389.0          fly
1    bird  parrot      24.0          fly
2  mammal    lion      80.5          run
3  mammal  monkey       NaN         jump

6、另外,如果像df3这样的索引有多个级别(level),我们可以只重置其中的一个子集(subset)。比如重置df3的class子集,重置之后原label为‘’class‘的index被重置为列名为‘class’的数据列。

df5 = df3.reset_index(level='class')
print(df5)
"""----------------运行结果----------------"""
         class speed_max species_type
name
falcon    bird     389.0          fly
parrot    bird      24.0          fly
lion    mammal      80.5          run
monkey  mammal       NaN         jump

7、我们对df5执行drop=True的操作,结果如下。可以发现,结果只删除了1个index,即label为‘name’的index,这是由于在df5中我们已经把原label为‘class’的index重置为列名为‘class’的列数据了。

df6 = df5.reset_index(drop=True)
print(df6)
"""----------------运行结果----------------"""
    class speed_max species_type
0    bird     389.0          fly
1    bird      24.0          fly
2  mammal      80.5          run
3  mammal       NaN         jump

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>根据用户要求,我需要提供关于pandasreset_index方法的详细解释。参考提供的四个引用内容,我将整合信息并结构化回答。 首先注意系统指令要求:行内数学表达式用$...$,独立公式用$$...$$。但本问题不涉及数学公式,重点在方法解释。 用户明确要求"详细解释",因此我会覆盖以下方面: 1. 方法定义和基本功能 2. 主要参数说明(结合引用[1][3][4]) 3. 使用场景(特别强调groupby后的应用,引用[2]) 4. 示例演示(结合引用[2][3][4]的案例) 特别注意引用[2]提到的与set_index的逆操作关系。 计划回答结构: 1. 方法概述:一句话定义 + 核心功能 2. 参数详解:表格形式列出关键参数(参考引用[1][3][4]) 3. 使用示例:两个典型场景(保留原索引和删除原索引) 4. 常见应用场景:特别说明groupby后重置索引(引用[2]) 5. 注意事项:inplace参数的影响等 最后按要求生成相关问题 </think>### pandas中`reset_index`方法详细解释 `reset_index()`是Pandas中用于重置DataFrame或Series索引的核心方法,主要解决索引混乱或需将索引转换为普通列的场景。以下是其核心要点: --- #### **一、核心功能** 1. **索引重置** 将当前索引(自定义索引、多层索引等)转换为默认整数索引$(0,1,2,\dots)$,同时可选择是否保留原索引。 - **保留原索引**:原索引转为新列添加到数据中(默认`drop=False`)[^2][^3] - **删除原索引**:直接丢弃原索引(`drop=True`)[^1][^4] 2. **与`set_index()`的逆操作** 如引用[^2]强调:`reset_index()`和`set_index()`互为逆操作,常用于索引与列的互换。 --- #### **二、关键参数详解** | 参数 | 说明 | 默认值 | |------|------|--------| | **`drop`** | 是否丢弃原索引。`True`删除,`False`保留为列 | `False` | | **`inplace`** | 是否原地修改数据。`True`直接修改原对象,`False`返回新对象 | `False` | | **`level`** | 针对多层索引(MultiIndex),指定要重置的层级 | `None`(重置所有) | | **`col_fill`** | 当列名冲突时,填充新列名的层级名 | `""`(空字符串) | | **`allow_duplicates`** | 是否允许重置后存在重复列名 | `False` | > 💡 特殊说明: > - **Series对象**:重置后返回DataFrame(原索引转为列,值列名为原Series名)[^3] > - **多层索引**:可通过`level`指定部分索引重置(如`level=1`) --- #### **三、典型使用场景** 1. **`groupby()`聚合后重置索引**(最高频场景[^2]) ```python # 分组聚合后索引变为分组键 grouped = df.groupby('grade').mean() print(grouped) ''' score grade A 34.0 B 58.666667 ''' # 重置索引将分组键恢复为列 reset_df = grouped.reset_index() print(reset_df) ''' grade score 0 A 34.000000 1 B 58.666667 ''' ``` 2. **丢弃旧索引(`drop=True`)** ```python df = pd.DataFrame({"A": [1,2,3], "B": [4,5,6]}, index=['x','y','z']) reset_df = df.reset_index(drop=True) # 删除原索引 ''' A B 0 1 4 1 2 5 2 3 6 ''' ``` 3. **多层索引部分重置** ```python multi_df = df.set_index(['grade', 'name']) partial_reset = multi_df.reset_index(level='grade') # 仅重置grade层级 ``` --- #### **四、注意事项** 1. **避免列名冲突**:若原索引名与列名重复,用`col_fill`指定新列名前缀。 2. **内存优化**:大数据集慎用`inplace=True`,错误操作不可逆。 3. **与`set_index`配合**: ```python df.set_index('id').query('score>60').reset_index() # 链式调用 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

地球被支点撬走啦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值