比较groupby中的字符串行并为新列赋值

2024-09-27 04:12:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个员工数据集(他们的ID)和几年来他们老板的名字

df:

enter image description here

我需要做的是看看员工是否有老板的变动。因此,期望的输出是:

enter image description here

对于只出现在df中一次的员工,我只分配0(没有老板的变动)。然而,我不知道如何为在df工作了几年的员工做这件事

我在想,首先我需要为df中出现的第一年分配0(因为我们不知道以前谁是老板,因此没有老板的变化)。然后,我需要将boss的名称与下一行中的名称进行比较,并决定是将1还是0分配到ManagerChange列中

到目前为止,我将df拆分为两个(具有唯一ID和重复ID),并为唯一ID的ManagerChange分配了0

然后我对重复的ID进行分组,并按年份对它们进行排序。但是,我是Python新手,无法理解如何比较字符串并将结果值分配给groupby中的新列。请帮忙

到目前为止,我掌握的代码是:

# splitting database in two
bool_series = df["ID"].duplicated(keep=False)

df_duplicated=df[bool_series]

df_unique = df[~bool_series]

# assigning 0 for ManagerChange for the unique IDs
df_unique['ManagerChange'] = 0

# groupby by ID and sorting by year for the duplicated IDs
df_duplicated.groupby('ID').apply(lambda x: x.sort_values('Year'))

Tags: the名称ididsdfforby员工
1条回答
网友
1楼 · 发布于 2024-09-27 04:12:19

您可以按shift()分组,然后在Boss列上进行比较

# Sort value first
df.sort_values(['ID', 'Year'], inplace=True)

# Compare Boss column with shifted Boss column
df['ManagerChange'] = df.groupby('ID').apply(lambda group: group['Boss'] != group['Boss'].shift(1)).tolist()

# Change True to 1, False to 0
df['ManagerChange'] = df['ManagerChange'].map({True: 1, False: 0})

# Sort df to original df
df = df.sort_index()

# Change the first in each group to 0
df.loc[df.groupby('ID').head(1).index, 'ManagerChange'] = 0
# print(df)

     ID  Year     Boss  ManagerChange
0  1234  2018     Anna              0
1   567  2019    Sarah              0
2  1234  2020  Michael              0
3  8976  2019     John              0
4  1234  2019  Michael              1
5  8976  2020     John              0

您还可以使用fill_value参数,这将帮助您摆脱最后的df.loc[]操作

# Sort value first
df.sort_values(['ID', 'Year'], inplace=True)

df['ManagerChange'] = df.groupby('ID').apply(lambda group: group['Boss'] != group['Boss'].shift(1, fill_value=group['Boss'].iloc[0])).tolist()

# Change True to 1, False to 0
df['ManagerChange'] = df['ManagerChange'].map({True: 1, False: 0})

# Sort df to original df
df = df.sort_index()

相关问题 更多 >

    热门问题