我有一个数据集,其中每个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与原始表中的ID不同。第二个问题:每个ID超过6个月的总和是不正确的。
答案 0 :(得分:0)
按某些列对数据框进行分组时,这些列将成为您的新索引。
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())
答案 1 :(得分:0)
您可以直接使用关键字参数reset_index()
代替as_index
:df.groupby('ID', as_index=False)
这将在结果ID
中保留列DataFrameGroupBy
,如groupby()
's doc中所述。
as_index:boolean,默认为True
对于聚合输出,返回以组标签作为索引的对象。仅与DataFrame输入相关。 as_index = False实际上是“SQL风格”分组输出