根据其他列的分组依据为列设置值

时间:2018-06-29 18:23:42

标签: python pandas dataframe

尝试使用熊猫loc通过critera子集数据帧并为另一列提供值。

初始化数据帧

import random
random.seed(100)

nums = 100
df = pd.DataFrame({'value':[random.randint(-7, 10) for x in range(nums)],
                      'id': [random.randint(500, 520) for x in range(nums)], 
                     'prod': [random.choice(['carrots', 'apples', 'pears', 'corn', 'baby corn', 'peppers', 'jalapenos', 'chicken', 'beef', 'raddishes']) for x in range(nums)],
                     'region':[random.choice(['east', 'west', 'central', 'south']) for x in range(nums)],
                     'country':[random.choice(['us', 'ca', 'mx']) for x in range(nums)],
                     'tag': np.nan})

我正在尝试执行类似的操作,例如“按usca过滤数据集,但仅在区域eastwest中进行,并且将值的总和分组prodid为负。

执行以下操作按照我刚刚对数据帧进行分组的方式对数据帧进行索引,但是我试图按索引将其隔离。

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.loc[(df.country.isin(['us', 'ca'])) & (df.region.isin(['east', 'west'])) & (df.groupby(['id', 'prod'])['value'].sum().loc[lambda x: x <0]), 'tag'] = True

如何将groupedby数据框的结果用作熊猫loc中的过滤器?

1 个答案:

答案 0 :(得分:2)

如果您使用.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

这对您有帮助吗?