Python 3.x 在特定列中聚合除特定值以外的数据
我在pandas dataframe python中有这样的数据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['
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