繁体   English   中英

比较groupby的第一行和最后一行并创建新值

[英]Comparing first and last row of groupby and creating new value

我有一个包含多个值的数据框,并希望按“电子邮件”列进行分组,检索第一行和最后一行,并进行比较以查看类别列的状态是否发生变化。 例如,如果类别是从 MGR 到 MGR,则没有变化。 如果类别从 EMP 更改为 MGR,则它反映了状态的更改。

date                 email               category
13-04-2018            johnson@abc.com     MGR
13-04-2018            linsay@abc.com      EMP
18-04-2018            kelphil@abc.com     EMP
20-04-2018            rsling@abc.com      MGR
11-01-2019            johnson@abc.com     MGR
15-10-2019            johnson@abc.com     MGR
16-11-2019            kelphil@abc.com     MGR
31-01-2020            sanson@abc.com      EMP
02-05-2020            rsling@abc.com      MGR
05-08-2020            rsling@abc.com      MGR
14-02-2021            sanson@abc.com      MGR
15-02-2021            linsay@abc.com      MGR

想得到以下结果

date                 email               category    status
13-04-2018            johnson@abc.com     MGR        no change
15-10-2019            johnson@abc.com     MGR        no change
13-04-2018            linsay@abc.com      EMP        change
15-02-2021            linsay@abc.com      MGR        change
18-04-2018            kelphil@abc.com     EMP        change 
16-11-2019            kelphil@abc.com     MGR        change 
20-04-2018            rsling@abc.com      MGR        no change
05-08-2020            rsling@abc.com      MGR        no change
31-01-2020            sanson@abc.com      EMP        change 
14-02-2021            sanson@abc.com      MGR        change

我已经尝试了以下代码,但它似乎只根据 groupby 检索第一行和最后一行。 有什么方法可以比较第一行和最后一行之间的值吗?

#get the first and last row of the groupby
df2 = df.groupby('email', as_index=False).nth([0,-1])

感谢任何形式的帮助,谢谢。

不确定它是否足够有效,但它运行良好。

def check_status(group):
    selected = [False] * len(group)
    selected[0] = selected[-1] = True
    new_group = group[selected]
    new_group['status'] = 'change' if new_group.category.is_unique else 'no change'
    return new_group

print(df.groupby('email').apply(check_status).reset_index(drop=True))

尝试:

这将检查 groupby 元素是否具有连续的(相同的值与否),如果有任何更改,它将设置标志。

fl = lambda s: s.iloc[[0,-1]]
res = df.groupby('email')['category'].apply(lambda x: (fl(x).shift(1).ne(fl(x)) & (fl(x).nunique()>1)))
res.index = res.index.droplevel()
df['status'] = res
df.dropna(inplace=True)
df['status'] = np.where(df.status,  'Change', 'No Change')

df.sort_values(by='email'):

日期 电子邮件 类别 地位
0 13-04-2018 johnson@abc.com MGR 没变化
5 15-10-2019 johnson@abc.com MGR 没变化
2 18-04-2018 kelphil@abc.com 电磁脉冲 改变
6 16-11-2019 kelphil@abc.com MGR 改变
1 13-04-2018 linsay@abc.com 电磁脉冲 改变
11 15-02-2021 linsay@abc.com MGR 改变
3 20-04-2018 rsling@abc.com MGR 没变化
9 05-08-2020 rsling@abc.com MGR 没变化
7 31-01-2020 sanson@abc.com 电磁脉冲 改变
10 14-02-2021 sanson@abc.com MGR 改变

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM