[英]Comparing rows of string inside groupby and assigning a value to a new column pandas
我有一個員工數據集(他們的 ID)和他們老板的名字,這些數據已經有好幾年了。
東風:
我需要做的是看看員工是否有老板的變化。 因此,所需的 output 是:
對於只出現在 df 中的員工,我只分配 0(沒有老板的變化)。 但是,我不知道如何為在 df 工作了幾年的員工做這件事。
我在想首先我需要為他們出現在df中的第一年分配0(因為我們不知道之前誰是老板,因此沒有老板的變化)。 然后我需要將老板的名字與下一行的名字進行比較,並決定將 1 或 0 分配到 ManagerChange 列中。
到目前為止,我將 df 一分為二(具有唯一 ID 和重復 ID),並將 0 分配給 ManagerChange 以獲得唯一 ID。
然后我將重復的 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'))
您可以 groupby 然后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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.