Python 3.x 在特定列中聚合除特定值以外的数据

Python 3.x 在特定列中聚合除特定值以外的数据,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我在pandas dataframe python中有这样的数据 df = pd.DataFrame({ 'ID':range(1, 8), 'Type':list('XXYYZZZ'), 'Value':[2,3,2,9,6,1,4] }) 我要生成的oputput是 如何使用python dataframe生成这些结果。我想包括类型列的所有Y值,但不想将它们聚合。第一次筛选值依据、聚合和附加筛选行、最后排序: mask = df['

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

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

})
我要生成的oputput是

如何使用python dataframe生成这些结果。我想包括类型列的所有Y值,但不想将它们聚合。

第一次筛选值依据、聚合和附加筛选行、最后排序:

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
如果需要
ID
列的
1
数据长度的范围

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
与系列
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']])

什么是过滤器?类型列是过滤器因为顺序。超级,我现在明白了。如果我必须提供多个选项怎么办?e、 Gy和X?@AhsanMukhtar-那么您需要第一次还是最后一次使用解决方案?X,Y匹配需要做什么更改?没关系,我想出来了。我需要添加.isin()运算符,而不是==。谢谢你能解释一下这行是做什么的吗?g=np。其中(mask,mask.cumsum()+1,0)是,需要相同的
g=np。其中(mask,mask.cumsum()+1,0)
表示使用mask的累积真值和创建新数组,其中1仅用于真值,否则为0-换句话说,它仅为匹配行创建计数器,否则为0