pandas中reset_index()有什么用?

envsm3lx  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(74)

在阅读这篇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中理解这个方法,但是不明白它是什么意思 reset the index of a restrame。

hmae6n7t

hmae6n7t1#

一个简单的解释是; 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

字符串

kkbh8khc

kkbh8khc2#

重置索引将创建从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

svmlkihl

svmlkihl3#

我认为这里更好的方法是使用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()会发生什么?
这里是reset_index()之前的Series,所以在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中没有参数。这意味着它通过两个DataFrame之间的公共列名的交集使用参数on,这里是order列。

vawmfj5a

vawmfj5a4#

回答你的问题:
我的问题是,考虑到序列,如果我不调用reset_index()会发生什么?
你将有一个多索引,由你应用了group-by语句的键组成。例如,在你的例子中,“order”。具体到文章,两个数组的索引不同可能会导致错误的合并(在group-by语句之后完成)。
因此,需要重置索引来执行正确的合并。

相关问题