如何在客户交易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
相关产品推荐
相关产品推荐

