如何用Python对堆叠式DataFrame中的支付趋势进行正负分类?
如何用Python对堆叠数据中的客户支付趋势分类
嘿,我来帮你搞定这个问题!要给每个客户的支付趋势分成Positive(上升)或Negative(下降),我们可以按「排序→分组计算趋势→生成结果」的步骤来做,这里给你两种实用的方法,适配不同的场景:
先准备好数据
首先我们把你给出的示例数据转换成Pandas DataFrame:
import pandas as pd data = { 'period': [2, 3, 1, 1, 2, 2, 3, 1], 'customer': ['John', 'Doe', 'Jane', 'John', 'Doe', 'Jane', 'John', 'Doe'], 'pay': [400, 300, 100, 350, 250, 150, 145, 225] } df = pd.DataFrame(data)
第一步:按客户和时间排序
不管用哪种方法,首先得保证每个客户的支付数据是按period的时间顺序排列的,不然计算趋势会出错:
# 按客户分组,再按period升序排序 df_sorted = df.sort_values(by=['customer', 'period'])
方法1:首尾值对比(简单直观,适合固定周期数据)
如果每个客户的周期数量固定(比如你这里都是3个period),直接对比第一期和最后一期的支付金额就够了,操作简单:
# 定义一个函数,判断单个客户的趋势 def get_trend_simple(group): first_pay = group['pay'].iloc[0] # 第一期支付 last_pay = group['pay'].iloc[-1] # 最后一期支付 return 'Positive' if last_pay > first_pay else 'Negative' # 按客户分组应用函数,生成趋势结果 trend_result = df_sorted.groupby('customer').apply(get_trend_simple).reset_index(name='pay_trend')
运行后得到的trend_result就是你想要的结果:
customer pay_trend 0 Doe Positive 1 Jane Positive 2 John Negative
方法2:线性回归斜率判断(更通用,适合多周期数据)
如果客户有更多的period,或者你想反映整体的变化趋势(而不是只看首尾),用线性回归计算斜率的方法更准确:
我们需要用到scipy的线性回归工具:
from scipy.stats import linregress # 定义函数,通过斜率判断趋势 def get_trend_slope(group): x = group['period'] # 时间变量 y = group['pay'] # 支付金额 # 计算线性回归的斜率 slope, _, _, _, _ = linregress(x, y) # 斜率为正就是上升趋势,负则为下降 return 'Positive' if slope > 0 else 'Negative' # 分组计算趋势 trend_result_slope = df_sorted.groupby('customer').apply(get_trend_slope).reset_index(name='pay_trend')
对示例数据来说,这个方法的结果和方法1完全一致,因为整体趋势和首尾对比的结果相同~
可选:把趋势合并回原数据
如果你想把pay_trend列添加到原来的堆叠DataFrame里,用merge就可以:
final_df = df.merge(trend_result, on='customer')
这样原数据的每一行都会带上对应的客户趋势啦!
内容的提问来源于stack exchange,提问作者Satsu
相关产品推荐
相关产品推荐

