基于 pandas 中的 grouped_by 按列求和时如何保留索引

How to keep indexes when sum by columns based on grouped_by in pandas

我有一个数据集,其中每个 ID 有 6 个对应的行。我想将此数据集按 ID 列分组并使用 sum 求和聚合。我写了这段代码:

col = [col for col in train.columns if col not in ['Month', 'ID']]
train.groupby('ID')[col].sum().reset_index()

一切正常,只是我丢失了列 ID。现在,我初始数据库中的唯一 ID 消失了,取而代之的是我只是枚举了从 0 到结果数据集中的行数的 ID。我想保留初始索引,因为我需要将这个数据集与另一个数据集进一步合并。我该如何处理这个问题?非常感谢您的帮助!

P.S:删除reset_index()没有效果

P.S:您可以在图像上看到两个问题。在第一张图片上有原始数据库。您可以看到每个 ID 有 6 个条目。在第二张图片上有一个数据库,它是分组语句的结果。第一个问题:ID和原来的不一样table。第二个问题:每个ID超过6个月的总和不正确

当您按某些列对数据框进行分组时,这些列将成为您的新索引。

import pandas as pd
import numpy as np

# Create data

n = 6; m = 3
col_id = np.hstack([['id-'+str(i)] * n for i in range(m)]).reshape(-1, 1)
np.random.shuffle(col_id)
data = np.random.rand(m*n, m) 
columns = ['v'+str(i+1) for i in range(m)]
df = pd.DataFrame(data, columns=columns)
df['ID'] = col_id

# Group by ID

print(df.groupby('ID').sum())

只会给你

            v1        v2        v3
ID                                
id-0  2.099219  2.708839  2.766141
id-1  2.554117  2.183166  3.914883
id-2  2.485505  2.739834  2.250873

如果您只想返回 ID 列,则只需 reset_index()

print(df.groupby('ID').sum().reset_index())

这会给你留下

     ID        v1        v2        v3
0  id-0  2.099219  2.708839  2.766141
1  id-1  2.554117  2.183166  3.914883
2  id-2  2.485505  2.739834  2.250873

注:

groupby 将按其索引对生成的 DataFrame 进行排序。如果您出于任何原因不想这样做,只需设置 sorted=False(另请参阅 documentation

print(df.groupby('ID', sorted=false).sum())

您可以简单地使用关键字参数 as_index 而不是使用 reset_index()df.groupby('ID', as_index=False) 这将保留结果 DataFrameGroupBy 中的列 ID,如 groupby()'s doc.

中所述

as_index : boolean, default True

For aggregated output, return object with group labels as the index. Only relevant for DataFrame input. as_index=False is effectively “SQL-style” grouped output