如何在基于pandas

时间:2017-10-07 10:12:48

标签: python pandas pandas-groupby

我有一个数据集,其中每个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个月的总和是不正确的。

Image1 Image2

2 个答案:

答案 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_indexdf.groupby('ID', as_index=False) 这将在结果ID中保留列DataFrameGroupBy,如groupby()'s doc中所述。

  

as_index:boolean,默认为True

     

对于聚合输出,返回以组标签作为索引的对象。仅与DataFrame输入相关。 as_index = False实际上是“SQL风格”分组输出