将DataFrame按arange为索引分组成新的DataFrame

8

我是一位有用的助手,可以为您进行文本翻译。

以下是需要翻译的内容:

我有一个问题,简化如下。考虑这个Pandas DataFrame,df_a:

df_a=pd.DataFrame([['1001',34.3,'red'],['1001',900.04,'red'],['1001',776,'red'],['1003',18.95,'green'],['1004',321.2,'blue']],columns=['id','amount','name'])

    id      amount  name
0   1001    34.30   red
1   1001    900.04  red
2   1001    776.00  red
3   1003    18.95   green
4   1004    321.20  blue

我希望能够将这个数据框按照金额求和分组,并创建一个类似于'arange'的新索引。以下是我想要得到的结果:

    id      amount
0   1001    1710.34
1   1003    18.95
2   1004    321.20

但是我的努力只创建了一个Series(我希望得到一个DataFrame作为结果):
df_a.groupby(['id'])['amount'].sum()

id
1001    1710.34
1003      18.95
1004     321.20
Name: amount, dtype: float64

或者基于id列创建一个新的索引:

pd.DataFrame(df_a.groupby(['id'])['amount'].sum())

        amount
id  
1001    1710.34
1003    18.95
1004    321.20

我也尝试了传递索引参数,但那也不起作用:

pd.DataFrame(df_a.groupby(['id'])['amount'].sum(),index=df_a.index.values)

   amount
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN

有没有一个优雅的解决方案?
2个回答

14

你在groupby中有一个参数叫做as_index

df_a.groupby('id', as_index = False)['amount'].sum()

你获得

    id  amount
0   1001    1710.34
1   1003    18.95
2   1004    321.20

1
谢谢你的回答!这是一个典型的“看手册”案例:-| 对此感到抱歉,但我在搜索索引、重新索引等时找不到它... - Bas

5
你可以尝试添加 to_frame()reset_index() 来实现以下操作:
new_df = df_a.groupby(['id'])['amount'].sum().to_frame('amount').reset_index()
print(new_df)

结果:

     id   amount
0  1001  1710.34
1  1003    18.95
2  1004   321.20

如果您只使用to_frame(),也就是使用以下代码: df_a.groupby(['id'])['amount'].sum().to_frame('amount') 它会按照如下方式保留id的索引:
      amount
id           
1001  1710.34
1003    18.95
1004   321.20

另一种方法是在你上面的代码中重置数据框索引:

new_df = pd.DataFrame(df_a.groupby(['id'])['amount'].sum()).reset_index()

输出结果与上述相同:

     id   amount
0  1001  1710.34
1  1003    18.95
2  1004   321.20

感谢您的回答!! 这是一个典型的“读手册”案例:-| 对此很抱歉,但我在搜索索引,重新索引等时找不到它... - Bas
@学生 谢谢伙计!我一直缺少reset_index(),导致遇到了问题。 - Souvik Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接