簡體   English   中英

比較 groupby 中的字符串行並將值分配給新列 pandas

[英]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.

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