You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在客户交易DataFrame中获取首个非零值对应的列名?

解决方案

要实现给每个客户标记首次大于0交易对应的周列名,你可以通过布尔掩码结合idxmax的方式解决,核心是利用布尔数组的特性定位首个非零值位置,而非直接对数值列使用idmax。

完整代码示例

# 提取交易数据列(排除CUST_ID列)
transaction_columns = customer_df.columns[1:]
# 生成标记交易值>0的布尔掩码
non_zero_mask = customer_df[transaction_columns] > 0
# 获取每行首个非零交易对应的列名
first_sale = non_zero_mask.idxmax(axis=1)
# 处理全零交易的客户,替换为指定默认日期
all_zero_customers = ~non_zero_mask.any(axis=1)
first_sale[all_zero_customers] = "2022-12-01"
# 将结果添加为新列
customer_df["first_sale"] = first_sale

代码解释

  • 分离交易列:先把CUST_ID以外的日期列单独提取出来,聚焦交易数据处理。
  • 创建布尔掩码:用>0生成一个和交易列结构一致的布尔DataFrame,True表示对应位置交易值大于0。
  • 定位首个非零列:对布尔掩码使用idxmax(axis=1),由于布尔值中True等价于1、False等价于0,这个方法会返回每行第一个True对应的列名,也就是首次出现大于0交易的周。
  • 处理全零情况:用~non_zero_mask.any(axis=1)筛选出所有交易值都是0的客户行,将他们的first_sale替换为你指定的默认日期(示例中是2022-12-01)。
  • 添加新列:将处理后的结果赋值给原DataFrame的first_sale列。

验证结果

运行代码后,你的DataFrame会和期望输出一致:

  • ADS49485的首次交易在2023-03-28
  • ADS49644的首次交易在2021-01-08
  • ADS31234全零交易,first_sale设为2022-12-01

内容的提问来源于stack exchange,提问作者dsexplorer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:12:40