Python 基于其他列的groupby设置列的值

Python 基于其他列的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

尝试使用pandas
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