熊猫根据条件分组

时间:2018-08-15 17:55:46

标签: python pandas

我想将父笼的值设置为>的值 基于id列的分组。

has_highest_owner == 'Yes'

就我而言,我想将所有行的父级笼设置为4TMM7

id         has_highest_owner    parent_cage 
834951691                       3TNF2   
834951691                       4D149   
834951691   Yes                 4TMM7   

3 个答案:

答案 0 :(得分:1)

这是最有效,最直接的IMO解决方案:

df['parent_cage'] = df.fillna('').sort_values(['id','has_highest_owner']).groupby('id')['parent_cage'].transform('last')

对于样本df:

          id has_highest_owner parent_cage
0  834951691                         3TNF2
1  834951691                         4D149
2  834951691               Yes       4TMM7
3  987345927                         83H85
4  987345927               Yes       9283D
5  987345927                         74JSS

收益:

          id has_highest_owner parent_cage
0  834951691                         4TMM7
1  834951691                         4TMM7
2  834951691               Yes       4TMM7
3  987345927                         9283D
4  987345927               Yes       9283D
5  987345927                         9283D

答案 1 :(得分:0)

这应该做到:

df_filtered = df.loc[df.has_highest_owner=='Yes'][['id','parent_cage']]
df['parent_cage'] = df.merge(df_filtered, on='id').parent_cage_y
df

enter image description here

首先根据您的条件过滤出df,然后根据分组的id合并回原始df!

答案 2 :(得分:0)

设置 (显示多个id):

df = pd.DataFrame({
    'id': [1,1,1,2,2,2],
    'highest': ['', '', 'Yes', '', 'Yes', ''],
    'parent': [123,345,567, 789,256,15]
})

使用mask

df = df.set_index('id')
df.assign(parent=df.mask(df.highest.ne('Yes')).groupby(level=0).parent.ffill().bfill())

   highest  parent
id
1            567.0
1            567.0
1      Yes   567.0
2            256.0
2      Yes   256.0
2            256.0