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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:51:45