pandas - 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任何地方。
任何帮助/提示将不胜感激!
解决方案
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)
推荐阅读
- c# - 将 wpf:ComboBox 绑定到 XAML 中的静态类
- grafana - 在 Grafana 时间序列图上使用属性作为预测值
- python-unicode - 此命令 fig, axs = plt.subplots(2, 2) 显示错误 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
- python - 有效地处理熊猫数据框中不一致的日期格式字符串中的日期?
- python - Python 3D-Rotation of Text in 3D Plotly Plot
- c++ - 如何多次使用mysql_fetch_row而不获取NULL值(C++)(MySQL C API)
- macos - 无法在 MacOs 上使用 .Net 5.0 WebApi 和 Docker 和 https 配置 HTTPS 端点错误
- pandas - 如何获取包含体育统计表中相应列描述的中间列?
- python - 尝试使用 smtplib.SMTP.sendmail() 将文本从 python 脚本发送到单元格号码
- python - 如何使用 SQLAlchemy 插入数据