首页 > 解决方案 > 是否可以维护 Pandas 中每个 CSV 列的跟踪记录?

问题描述

我正在使用 Pandas 加载 CSV,然后执行一些操作、数据操作等。一切都非常简单:

import pandas as pd
df = pd.read_csv("file.csv", header=7)

完成所有操作后,数据将导出为 CSV、JSON 或类似的格式,以便导入数据库。记录原始 CSV 行号和行内容会很有用,这样我们就可以回溯以后发现的任何问题。那可能吗?应该怎么做?

因此,例如,我从以下内容开始:

name, height
Arnold Schwarzenegger, 188
Danny De Vito, 147

我将数据处理成:

[{"first_name": "Arnold", "last_name": "Schwarzenegger", "height": 1.88},
 {"first_name": "Danny De", "last_name": "Vito", "height": 1.47}]

然后我导入数据库(PostgreSQL 在生产中运行)。后来我们发现Danny DeVito的名字被篡改了,是处理还是原始数据?所以,我想将数据导出到:

[{"first_name": "Arnold", "last_name": "Schwarzenegger", "height": 1.88,
  "csv_line_number": 1, "csv_line": "Arnold Schwarzenegger, 188"},
 {"first_name": "Danny De", "last_name": "Vito", "height": 1.47,
  "csv_line_number": 2, "csv_line": "Danny De Vito, 147"}]

因此,只需检查数据库,我们就可以开始对发生的事情有所了解。

标签: pythonpandascsv

解决方案


到目前为止,“稍后回溯”的最安全和最简单的方法是简单地重复:

df = pd.read_csv("file.csv")

...然后用它来做任何你想做的验证。

在要复制数据框的情况下,最好使用:

df_copy = df.copy(deep=True) 

...这样你就可以确保你得到一个真正的完整副本。此副本还将避免因更改辅助函数或其他类似情况中的数据框而导致的破坏。

如果您的数据集非常大并且复制不是一个好主意,并且出于某种原因只是重复读取原始 csv(这将是最安全的),则需要有关您想要执行的验证类型的更多信息。例如,仅存储您从中获得的内容df.describe()将为您以后验证提供相对良好的基础。但同样,这将取决于所讨论的系统的关键程度等。

如果情况只是解决“如何将使用 pd.read_csv() 打开的 CSV 文件的原始行号和整行作为数据框中的新列”,您可以通过以下方式完成:

df = pd.read_csv('some_data.csv')
df['original'] = df.astype(str).apply(lambda x: ','.join(x), axis=1)
df['row_id'] = range(len(df))

您的数据框现在有两个新列:

  • row_id 从 0 开始的列
  • 用逗号分隔原始记录的列(行)

请注意,我不会将df.reset_index()其用作生成行号索引的方法,因为这是一种不好的做法,会在其他情况下导致问题。


推荐阅读