首页 > 解决方案 > Pandas 聚合特定列中特定值以外的数据

问题描述

我在pandas dataframe python中有这样的数据

df = pd.DataFrame({
         'ID':range(1, 8),
         'Type':list('XXYYZZZ'),
         'Value':[2,3,2,9,6,1,4]

})

我想要生成的输出是

在此处输入图像描述

如何使用 python pandas 数据框生成这些结果。我想包括类型列的所有Y值,并且不想聚合它们。

标签: python-3.xpandasdataframe

解决方案


首先过滤值boolean indexing,聚合并附加过滤掉的行,最后排序:

mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
                .agg({'ID':'first', 'Value':'sum'})
                .append(df[mask])
                .sort_values('ID'))
print (df1)
   ID Type  Value
0   1    X      5
2   3    Y      2
3   4    Y      9
1   5    Z     11

如果想要1length of data的范围ID

mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
                .agg({'ID':'first', 'Value':'sum'})
                .append(df[mask])
                .sort_values('ID')
                .assign(ID = lambda x:  np.arange(1, len(x) + 1)))
print (df1)
   ID Type  Value
0   1    X      5
2   2    Y      2
3   3    Y      9
1   4    Z     11

另一个想法是仅为行创建唯一值的辅助列Y并按两列聚合:

mask = df['Type'] == 'Y'
df['g'] = np.where(mask, mask.cumsum() + 1, 0)

df1 = (df.groupby(['Type','g'], as_index=False)
        .agg({'ID':'first', 'Value':'sum'})
        .drop('g', axis=1)[['ID','Type','Value']])

print (df1)
   ID Type  Value
0   1    X      5
1   3    Y      2
2   4    Y      9
3   5    Z     11

与 Series 类似的替代方案g,则drop不需要:

mask = df['Type'] == 'Y'
g = np.where(mask, mask.cumsum() + 1, 0)
df1 = (df.groupby(['Type',g], as_index=False)
        .agg({'ID':'first', 'Value':'sum'})[['ID','Type','Value']])

推荐阅读