pandas中的reset_index()有什么用?

Sau*_*ahu 5 python pandas

在阅读这篇文章时,我看到了这样的说法。

order_total = df.groupby('order')["ext price"].sum().rename("Order_Total").reset_index()
Run Code Online (Sandbox Code Playgroud)

除了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"]
Run Code Online (Sandbox Code Playgroud)

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

vis*_*man 6

一个简单的解释是: reset_index()获取当前索引,并将其放置在“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
Run Code Online (Sandbox Code Playgroud)


Ris*_*sal 5

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())
Run Code Online (Sandbox Code Playgroud)

之前输出reset_index()

                     name
ID                       
1             Hello Kitty
2             Hello Puppy
3   It is an Helloexample
4       for stackoverflow
5             Hello World
Run Code Online (Sandbox Code Playgroud)

之后的输出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
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 2

我认为这里更好的是使用与由聚合值填充的原始 DataFrame 相同大小的GroupBy.transformnew ,所以没有必要:Seriesmerge

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
Run Code Online (Sandbox Code Playgroud)

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

这是Seriesbefore reset_index(),所以 afterreset_index转换Series为 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
Run Code Online (Sandbox Code Playgroud)

代码中为什么需要 2 列 DataFrame 中没有参数merge。这意味着它on通过两个 DataFrame 之间的公共列名称的交集来使用参数,此处为order列。