Pandas DataFrame基于客户及组CSATE评分创建条件新列求助
Pandas 交叉反转状态列计算实现方案
你现有代码的问题是仅覆盖了「客户评分从低于组评分变为高于组评分」的单方向反转场景,遗漏了「客户评分从高于组评分变为低于组评分」的反向反转场景,因此无法输出符合预期的结果。
实现步骤
- 先计算
is_customer_perf_above_group_perf列:直接对两列做大小比较即可,返回布尔值 - 再计算
customer_group_csate_score_toggle_status列:对比当前行的大小关系与上一行的大小关系是否不一致,第一行无前置行默认返回False
完整可运行代码
import pandas as pd import numpy as np # 构造样例数据 data = { "customer_csate_score": [0.000, -0.4, 0, 0.578, 0.418, -0.765, 0.89], "group_csate_score": [-0.15, 0.12, 0.13, 0.81, 0.96, 0.1, -0.87] } df = pd.DataFrame(data) # 计算是否客户评分高于组评分 df['is_customer_perf_above_group_perf'] = df['customer_csate_score'] > df['group_csate_score'] # 计算反转状态:当前行和上一行大小关系不一致则为True df['customer_group_csate_score_toggle_status'] = ( df['is_customer_perf_above_group_perf'] != df['is_customer_perf_above_group_perf'].shift(fill_value=df['is_customer_perf_above_group_perf'].iloc[0]) )
如果需要封装为函数调用,可以用以下写法:
def check_cust_group_crossover(df, df_key1, df_key2): curr_above = df[df_key1] > df[df_key2] prev_above = df[df_key1].shift() > df[df_key2].shift() # 第一行无前置数据,填充为False return (curr_above != prev_above).fillna(False) # 调用函数生成列 df['customer_group_csate_score_toggle_status'] = check_cust_group_crossover(df, 'customer_csate_score', 'group_csate_score')
内容的提问来源于stack exchange,提问作者usert4jju7
相关产品推荐
相关产品推荐

