[英]Creating a new column based on conditions of first and last value of groupby Python
[英]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.