基于 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
我有一个数据集,其中每个 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