Pandas DataFrame重复写入CSV问题及时间戳列需求求助
问题修复与功能增强方案
原代码问题分析
- 去重逻辑错误:原
dups函数用drop_duplicates(keep=False)会移除所有存在重复的行(包括主文件中已有的原始行),而非仅保留新数据中未重复的部分,导致第三次写入时逻辑混乱,出现重复或错误追加。 - 缺少时间戳字段:未自动记录数据录入的时间信息。
修改后的完整代码
import pandas as pd from datetime import datetime # 示例学生数据(可替换为你的输入数据) student_dict = { "ID": [101, 102, 103, 104, 105], "Student": ["AAA", "BBB", "CCC", "DDD", "EEE"], "Mark": [50, 100, 99, 60, 80], "Address": ["St.AAA", "St.BBB", "St.CCC", "St.DDD", "St.EEE"], "PhoneNo": [1111111111, 2222222222, 3333333333, 4444444444, 5555555555] } # 生成DataFrame并添加录入时间戳 df = pd.DataFrame(student_dict) # 添加时间戳,格式为年-月-日 时:分:秒 df["Entry_Timestamp"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") fName = "Student_CSVresult.csv" try: # 读取已存在的主文件 existing_data = pd.read_csv(fName) print("当前主文件数据:") print(existing_data) # 筛选新数据中未在主文件出现过的行(以ID作为唯一标识) # 如果需要整行判断重复,可改为:~df.apply(tuple, axis=1).isin(existing_data.apply(tuple, axis=1)) new_unique_rows = df[~df["ID"].isin(existing_data["ID"])] if not new_unique_rows.empty: print("\n待追加的新数据:") print(new_unique_rows) # 追加到主文件,不覆盖,不写表头 new_unique_rows.to_csv(fName, mode="a", index=False, header=False) print("新数据已成功追加") else: print("无新的不重复数据需要追加") except FileNotFoundError: # 文件不存在时,直接写入带时间戳的完整数据 print("主文件不存在,创建新文件并写入初始数据") df.to_csv(fName, index=False) print("初始数据已写入新文件") except Exception as e: print(f"发生错误:{e}")
关键修改说明
- 添加时间戳:
- 使用
datetime.now().strftime()生成格式化的当前时间,作为Entry_Timestamp列添加到新数据中,确保每条记录都有录入时间。
- 使用
- 精准去重逻辑:
- 以
ID作为唯一标识(学生ID应为唯一值),通过~df["ID"].isin(existing_data["ID"])筛选出主文件中没有的新记录,避免重复追加。 - 如果需要基于整行内容判断重复,可替换为注释中的整行匹配逻辑。
- 以
- 安全追加:
- 仅当存在新的不重复数据时才执行追加操作,避免写入空内容。
- 追加时设置
header=False,防止重复写入表头。
测试验证
- 首次运行:创建文件并写入带时间戳的初始数据。
- 第二次运行含重复ID的新数据:仅追加ID为106、107的新记录,原有记录不重复。
- 第三次运行初始DataFrame:检测到所有ID已存在,无数据追加,不会出现重复。
内容的提问来源于stack exchange,提问作者Aks3
相关产品推荐
相关产品推荐

