【问题标题】:What is the use of reset_index() in pandas?pandas 中的 reset_index() 有什么用?
【发布时间】:2019-11-18 07:17:52
【问题描述】:

在阅读article 时,我看到了这个声明。

order_total = df.groupby('order')["ext price"].sum().rename("Order_Total").reset_index()

除了reset_index() 方法调用之外,其他一切我都清楚。 我的问题是,考虑到下面给出的顺序,如果我不打电话给reset_index() 会发生什么?

order_total = df.groupby('order')["ext price"].sum().rename("Order_Total").reset_index()
df_1 = df.merge(order_total)
df_1["Percent_of_Order"] = df_1["ext price"] / df_1["Order_Total"]

我试图从https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html 了解此方法,但无法理解重置数据帧的索引 是什么意思。

【问题讨论】:

  • groupby,顾名思义,通过一个键对您的内容进行分组,并将该键设置为索引。 reset_index 将索引(列)重置为常规列,并使用数字序列作为新索引。

标签: python pandas


【解决方案1】:

一个简单的解释是; reset_index() 获取当前索引,并将其放在“索引”列中。然后它为数据集重新创建一个新的“线性”索引。

df=pd.DataFrame([20,30,40,50],index=[2,3,4,5])

    0
2  20
3  30
4  40
5  50

df.reset_index()

   index   0
0      2  20
1      3  30
2      4  40
3      5  50

【讨论】:

    【解决方案2】:

    Reset Index 将从 0 开始创建索引,如果有任何列设置为索引,则删除。

    import pandas as pd
    
    df = pd.DataFrame(
        {
            "ID": [1, 2, 3, 4, 5],
            "name": [
                "Hello Kitty",
                "Hello Puppy",
                "It is an Helloexample",
                "for stackoverflow",
                "Hello World",
            ],
        }
    )
    newdf = df.set_index('ID')
    
    print newdf.reset_index()
    

    reset_index() 之前的输出:

                         name
    ID                       
    1             Hello Kitty
    2             Hello Puppy
    3   It is an Helloexample
    4       for stackoverflow
    5             Hello World
    

    reset_index() 后的输出:

       ID                   name
    0   1            Hello Kitty
    1   2            Hello Puppy
    2   3  It is an Helloexample
    3   4      for stackoverflow
    4   5            Hello World
    

    【讨论】:

      【解决方案3】:

      我认为这里更好的是使用GroupBy.transform 用于新的Series,其大小与由聚合值填充的原始DataFrame 相同,因此不需要merge

      df_1 = pd.DataFrame({
               'A':list('abcdef'),
               'ext price':[5,3,6,9,2,4],
               'order':list('aaabbb')
      })
      
      
      order_total1 = df_1.groupby('order')["ext price"].transform('sum')
      df_1["Percent_of_Order"] = df_1["ext price"] / order_total1
      print (df_1)
         A  ext price order  Percent_of_Order
      0  a          5     a          0.357143
      1  b          3     a          0.214286
      2  c          6     a          0.428571
      3  d          9     b          0.600000
      4  e          2     b          0.133333
      5  f          4     b          0.266667
      

      我的问题是如果考虑到顺序我不调用 reset_index() 会发生什么?

      这里是Seriesreset_index() 之前,所以在reset_indexSeries 转换为2 列DataFrame 之后,第一列由索引名称调用,第二列由Series 名称调用。

      order_total = df_1.groupby('order')["ext price"].sum().rename("Order_Total")
      print (order_total)
      order
      a    14
      b    15
      Name: Order_Total, dtype: int64
      
      print (type(order_total))
      <class 'pandas.core.series.Series'>
      
      print (order_total.name)
      Order_Total
      
      print (order_total.index.name)
      order
      
      print (order_total.reset_index())
        order  Order_Total
      0     a           14
      1     b           15
      

      您的代码中为什么需要 2 列 DataFrame 的原因是 merge 中没有参数。这意味着它使用参数on通过两个DataFrames之间的公共列名的交集,这里是order列。

      【讨论】:

      • 这真的很深入。谢谢。一个问题:list('abcdef')这是什么魔法,我期待['a', 'b', 'c', 'd', 'e']
      • @SauravSahu list 函数在应用于可迭代对象时会创建一个带有其元素的list。例如,list((1,2,3)) 生成 [1, 2, 3]list('a') 将生成 ['a']
      【解决方案4】:

      回答你的问题:

      我的问题是如果考虑到顺序我不调用 reset_index() 会发生什么?

      您将拥有一个由您应用 group-by 语句的键形成的多索引。 例如-在您的情况下为“订单”。 具体到文章,两个数据帧的索引不同可能会导致错误的合并(在group-by语句之后完成)。

      因此,需要一个重置索引来执行正确的合并。

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 1970-01-01
        • 2017-01-29
        • 2019-11-17
        • 1970-01-01
        • 2019-01-22
        • 2016-11-24
        • 2021-01-04
        • 1970-01-01
        相关资源
        最近更新 更多