如何基于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)和日期关联字段,确保只匹配同一客户的下月数据。具体步骤如下:
- 先将日期字段转为datetime类型,计算每条记录的下月日期
- 执行
merge时,同时用Cus_Number、Cus_Account匹配客户,用Next_Month和右侧的Date匹配下月数据 - 重命名并筛选需要的列,得到预期输出
修改后的代码:
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
相关产品推荐
相关产品推荐

