首页 > 解决方案 > Pandas 数据框:按唯一标识符分组,检查条件,如果满足/不满足条件,则将 1/0 应用于新列

问题描述

我有一个与客户流失有关的大型数据集,其中每个客户都有一个唯一标识符(编码密钥)。数据集是一个时间序列,每个客户每个月都有一行,因此日期和客户标识符列自然包含重复项。我要做的是添加一个新列(称为“流失”),并根据该特定客户的上个月是否为客户,将该列设置为 0 或 1。

我已经尝试了很多方法来做到这一点,但是每一个都失败了,要么做回溯,要么它们不能按预期工作。应该注意的是,我对 python 和 pandas 都很陌生,所以请解释一下我五岁的事情(笑)。

我尝试使用 pandas groupby 按唯一客户键对行进行分组,然后检查条件:

df2 = df2.groupby('customerid').assign(churn = [1 if date==max(date) else 0 for date in df2['date']])

这给出了回溯,因为 dataframegroupby 对象没有属性分配。

我还尝试了以下方法:

df2.sort_values(['date']).groupby('customerid').loc[df['date'] == max('date'), 'churn'] = 1
df2.sort_values(['date']).groupby('customerid').loc[df['date'] != max('date'), 'churn'] = 0

这给出了类似的回溯,但由于属性 loc

我也尝试过使用 numpy 方法,如下所示:

df2['churn'] = df2.groupby(['customerid']).np.where(df2['date'] == max('date'), 1, 0)

由于 dataframegroupby 再次给出回溯

和:

df2['churn'] = np.where((df2['date']==df2['date'].max()), 1, df2['churn'])

它不会提供回溯,但不能按预期工作,即它将 1 应用于所有行的最大日期的 churn 列,而不是特定客户 ID 的最大日期 - 回想起来这是完全可以理解的,因为没有指定客户 ID任何地方。

任何帮助/提示将不胜感激!

标签: pandasdataframepandas-groupby

解决方案


IIUC用于返回GroupBy.transform每组max的最大值并与date列进行比较,最后1,0通过掩码设置值:

mask = df2['date'].eq(df2.groupby('customerid')['date'].transform('max'))
df2['churn'] = np.where(mask, 1, 0)

df2['churn'] = mask.astype(int)

推荐阅读