关于python:将一个DataFrame分组到一个新的DataFrame中,并将范围作为索引

Groupby a DataFrame into a new DataFrame with arange as index

本问题已经有最佳答案,请猛点这里访问。

我有一个问题,在这个例子中简化了。考虑一下这个熊猫数据框架,df_a:

1
2
3
4
5
6
7
8
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"的索引。这应该是我想要的结果:

1
2
3
4
    id      amount
0   1001    1710.34
1   1003    18.95
2   1004    321.20

但是我的工作创建了一个系列(因此我想要一个数据框架):

1
2
3
4
5
6
7
df_a.groupby(['id'])['amount'].sum()

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

或基于ID列创建新索引:

1
2
3
4
5
6
7
pd.DataFrame(df_a.groupby(['id'])['amount'].sum())

        amount
id  
1001    1710.34
1003    18.95
1004    321.20

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

1
2
3
4
5
6
7
8
pd.DataFrame(df_a.groupby(['id'])['amount'].sum(),index=df_a.index.values)

   amount
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN

有人对此有优雅的解决方案吗?


在GroupBy中有一个参数作为索引

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

你得到

1
2
3
4
    id  amount
0   1001    1710.34
1   1003    18.95
2   1004    321.20


您可以通过添加to_frame()reset_index()来尝试以下操作:

1
2
new_df = df_a.groupby(['id'])['amount'].sum().to_frame('amount').reset_index()
print(new_df)

结果:

1
2
3
4
     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上的索引如下:

1
2
3
4
5
      amount
id          
1001  1710.34
1003    18.95
1004   321.20

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

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

输出与上述相同:

1
2
3
4
     id   amount
0  1001  1710.34
1  1003    18.95
2  1004   321.20