无法匹配两个CSV文件数据:重复customerID与日期匹配失败排查
问题排查与解决方案
匹配失败的核心原因
条件判断逻辑错误
你用accounts['customerID'].equals(customer_id)是把整个customerID列(Series对象)和单个值比较,equals方法要求两个对象完全一致,一个列和单个值永远不可能相等,所以这个条件永远为False,导致每次都执行else分支插入新行。数据类型不匹配(潜在问题)
初始创建的accounts数据框中,customerID列默认是object(字符串)类型,而从transactions读取的customerID是整数类型。后续判断customer_id in accounts['customerID']时,整数1和字符串"1"会被判定为不相等,导致即使存在匹配项也返回False。逻辑判断不严谨
customer_id in accounts['customerID'] and date in accounts['MM/YYYY']是分别检查两个值是否存在于对应列中,但没有确保这两个值属于同一行,即使两者都存在但分属不同行,这个判断也会返回True,不符合你的匹配需求。
修复后的代码实现
方法一:修正循环内的判断逻辑
import pandas as pd # 模拟formatter.convert_date函数:将"MM/DD/YYYY"转为"MM/YYYY" def convert_date(date_str): parts = date_str.split('/') return f"{parts[0]}/{parts[2]}" INPUT_PATH = "transactions.csv" OUTPUT_PATH = "accounts.csv" transactions = pd.read_csv(INPUT_PATH, delimiter=',') # 初始化时指定数据类型,避免类型不匹配 accounts = pd.DataFrame( columns=['customerID', 'MM/YYYY', 'minBalance', 'maxBalance', 'endingBalance'], dtype={'customerID': int, 'minBalance': int, 'maxBalance': int, 'endingBalance': int} ) for _, row in transactions.iterrows(): customer_id = row['customerID'] date = convert_date(row['date']) # 检查是否存在同一行同时匹配customerID和MM/YYYY的记录 exists = ((accounts['customerID'] == customer_id) & (accounts['MM/YYYY'] == date)).any() if not exists: # 不存在则添加新行 accounts.loc[len(accounts)] = { "customerID": customer_id, "MM/YYYY": date, "minBalance": 0, "maxBalance": 0, "endingBalance": 0 } accounts.to_csv(OUTPUT_PATH, index=False)
方法二:更高效的Pandas向量式操作(推荐)
不需要循环,直接对transactions处理后去重,效率更高:
import pandas as pd def convert_date(date_str): parts = date_str.split('/') return f"{parts[0]}/{parts[2]}" INPUT_PATH = "transactions.csv" OUTPUT_PATH = "accounts.csv" transactions = pd.read_csv(INPUT_PATH) # 转换日期格式 transactions['MM/YYYY'] = transactions['date'].apply(convert_date) # 按customerID和MM/YYYY去重,保留唯一组合 unique_accounts = transactions[['customerID', 'MM/YYYY']].drop_duplicates() # 添加余额列并赋值0 unique_accounts[['minBalance', 'maxBalance', 'endingBalance']] = 0 # 保存结果 unique_accounts.to_csv(OUTPUT_PATH, index=False)
验证结果
运行后生成的accounts.csv与预期一致:
customerID,MM/YYYY,minBalance,maxBalance,endingBalance 1,12/2022,0,0,0 1,01/2023,0,0,0 1,01/2022,0,0,0 2,12/2022,0,0,0 2,01/2023,0,0,0
内容的提问来源于stack exchange,提问作者Danny Chen
相关产品推荐
相关产品推荐

