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

如何基于Cus_Number和Cus_Account获取下月Bill_Status?

问题:匹配客户信息获取下月账单状态

需求:通过Cus_Number和Cus_Account两个字段验证匹配,获取每条记录对应的下月Bill_Status,最终输出包含Date、Cus_Number、Cus_Account、Bill_Status、Next_Month_Bill_Status的表格。

现有DataFrame:

import pandas as pd  

# 构造数据
data = {'Date': ['2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30', '2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30', '2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30'],
        'Cus_Number': ['1487', '1487', '1487', '1487', '1278', '1278', '1278', '1278', '1278', '1278', '1278', '1278'],
        'Cus_Account': ['101', '101', '101', '101', '120', '120', '120', '120', '122', '122', '122', '122'],
        'Bill_Status': [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]}  

# 创建DataFrame  
df = pd.DataFrame(data)  

当前尝试的代码未实现客户字段的匹配:

df=df.reset_index()
df['Date']=pd.to_datetime(df['Date'],infer_datetime_format=True)
df['Next_Month']=df['Date']+pd.DateOffset(months=1)
res=df.merge(df,right_on='Date',left_on='Next_Month',how='left')

解决方案

核心是在merge操作时,同时指定客户标识字段(Cus_Number、Cus_Account)和日期关联字段,确保只匹配同一客户的下月数据。具体步骤如下:

  1. 先将日期字段转为datetime类型,计算每条记录的下月日期
  2. 执行merge时,同时用Cus_Number、Cus_Account匹配客户,用Next_Month和右侧的Date匹配下月数据
  3. 重命名并筛选需要的列,得到预期输出

修改后的代码:

import pandas as pd

# 构造数据
data = {'Date': ['2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30', '2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30', '2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30'],
        'Cus_Number': ['1487', '1487', '1487', '1487', '1278', '1278', '1278', '1278', '1278', '1278', '1278', '1278'],
        'Cus_Account': ['101', '101', '101', '101', '120', '120', '120', '120', '122', '122', '122', '122'],
        'Bill_Status': [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]}  

df = pd.DataFrame(data)

# 处理日期字段
df['Date'] = pd.to_datetime(df['Date'])
df['Next_Month'] = df['Date'] + pd.DateOffset(months=1)

# 多字段匹配merge:客户标识+日期关联
merged_df = df.merge(
    df[['Date', 'Cus_Number', 'Cus_Account', 'Bill_Status']],
    left_on=['Cus_Number', 'Cus_Account', 'Next_Month'],
    right_on=['Cus_Number', 'Cus_Account', 'Date'],
    how='left',
    suffixes=('', '_next')
)

# 筛选并重命名需要的列
result = merged_df[['Date', 'Cus_Number', 'Cus_Account', 'Bill_Status', 'Bill_Status_next']].rename(
    columns={'Bill_Status_next': 'Next_Month_Bill_Status'}
)

print(result)

预期输出

执行代码后输出如下(最后一行无下月数据,所以Next_Month_Bill_Status为NaN):

Date Cus_Number Cus_Account  Bill_Status  Next_Month_Bill_Status
0  2022-01-31       1487         101            0                     0.0
1  2022-02-28       1487         101            0                     0.0
2  2022-03-31       1487         101            0                     1.0
3  2022-04-30       1487         101            1                     NaN
4  2022-01-31       1278         120            0                     1.0
5  2022-02-28       1278         120            1                     0.0
6  2022-03-31       1278         120            0                     0.0
7  2022-04-30       1278         120            0                     NaN
8  2022-01-31       1278         122            0                     1.0
9  2022-02-28       1278         122            1                     0.0
10 2022-03-31       1278         122            0                     0.0
11 2022-04-30       1278         122            0                     NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:45:38