Python 基于其他列的groupby设置列的值
尝试使用pandasPython 基于其他列的groupby设置列的值,python,pandas,dataframe,Python,Pandas,Dataframe,尝试使用pandasloc按critera将数据帧子集,并为另一列提供值 初始化数据帧 我试图做一些类似“按us或ca过滤数据集”的事情,但仅在east和west区域,并且分组的prod和id中的值之和为负值 执行以下操作会根据我刚才分组的内容对数据帧进行索引,但我会尝试通过索引将其隔离 df.groupby(['id', 'prod'])['value'].sum().loc[lambda x: x <0].head(10) id prod 500 apples
loc
按critera将数据帧子集,并为另一列提供值
初始化数据帧
我试图做一些类似“按us
或ca
过滤数据集”的事情,但仅在east
和west
区域,并且分组的prod
和id
中的值之和为负值
执行以下操作会根据我刚才分组的内容对数据帧进行索引,但我会尝试通过索引将其隔离
df.groupby(['id', 'prod'])['value'].sum().loc[lambda x: x <0].head(10)
id prod
500 apples -6
carrots -6
corn -6
501 apples -3
chicken -2
502 beef -3
pears -2
503 chicken -3
504 jalapenos -4
505 chicken -4
df.groupby(['id',prod'])['value'].sum().loc[lambda x:x如果您不使用.sum()
而使用.transform('sum')
则会得到每行返回的分组结果。通过将该值与<0
进行比较,可以得到布尔掩码
然后,我们可以在单独的行上创建不同的掩码,并使用&
将它们连接起来
m1 = df.country.isin({'us', 'ca'})
m2 = df.region.isin({'east', 'west'})
m3 = df.groupby(['id', 'prod'])['value'].transform('sum') < 0
df.loc[m1&m2&m3, 'tag'] = True
m1=df.country.isin({'us','ca'})
m2=df.region.isin({'east','west'})
m3=df.groupby(['id','prod'])['value'].transform('sum')<0
测向位置[m1、m2和m3,'标记']=正确
这对你有帮助吗?太好了,谢谢!我不知道转换会返回索引。@MattW。如果你的意思是正确的值。但是当我们与<0
比较时,我们得到了一个布尔掩码True
和False
,我们可以与其他掩码组合。很高兴我能提供帮助!不幸的是,我只能给出一个布尔掩码您只需向上投一票就可以获得良好的设置。拥有一个可查看的数据集真的很有帮助。
df.loc[(df.country.isin(['us', 'ca'])) & (df.region.isin(['east', 'west'])) & (df.groupby(['id', 'prod'])['value'].sum().loc[lambda x: x <0]), 'tag'] = True
m1 = df.country.isin({'us', 'ca'})
m2 = df.region.isin({'east', 'west'})
m3 = df.groupby(['id', 'prod'])['value'].transform('sum') < 0
df.loc[m1&m2&m3, 'tag'] = True