簡體   English   中英

根據其他列的groupby設置列的值

[英]setting a value for a column based on groupby of other columns

嘗試使用pandas 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

如何將groupby數據幀的結果用作pandas loc的過濾器?

如果您使用.sum()而不是.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

這對你有幫助嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM