我遇到了一个挑战,需要根据以下标准清理CSV文件中的数据:
- 如果数据带有日期,请从文件中删除具有NA值的数据
- 如果是重复项,请将其删除;以及
- 如果数据只存在,就不要管它了
我目前能够同时完成第2项和第3项,但我正在努力创造一个条件来获得其中的一项标准。
示例CSV文件
Name,Environment,Available,Date
Server_A,Test,NA,NA
Server_A,Test,Yes,20/08/2022
Server_A,Test,Yes,20/09/2022
Server_A,Test,Yes,20/09/2022
Server_B,Test,NA,NA
Server_B,Test,NA,NA
到目前为止的当前代码
import csv
input_file = 'sample.csv'
output_file = 'completed_output.csv'
with open(input_file, 'r') as inputFile, open(output_file, 'w') as outputFile:
seen = set()
for line in inputFile:
if line in seen:
continue
seen.add(line)
outputFile.write(line)
目前,这有助于重复和捕获唯一值。但是,我无法以最佳方式删除具有重复服务器的行。然而,这可能不太好用,因为集合类型是无序的,所以我不确定基于列进行比较的最佳方式,然后从那里向下筛选。
任何能帮助我的建议或解决方案都将不胜感激。
到目前为止的电流输出
Name,Environment,Available,Date
Server_A,Test,NA,NA
Server_A,Test,Yes,20/08/2022
Server_A,Test,Yes,20/09/2022
Server_B,Test,NA,NA
预期输出
Name,Environment,Available,Date
Server_A,Test,Yes,20/08/2022
Server_A,Test,Yes,20/09/2022
Server_B,Test,NA,NA
您可以使用panda,而不用手动执行所有这些操作。我编写了一个名为自定义过滤器的简短函数,它考虑了这些条件。潜在错误的一个方面可能是使用pd.NA,如果不起作用,则使用其他np.nan或None。
import pandas as pd
df = pd.read_csv('sample.csv')
df = df.drop_duplicates()
data_present = []
def custom_filter(x):
global data_present
if x[3] == pd.NA:
data_present.append(x[0])
return True
elif x[3] == pd.NA and x[0] not in data_present:
return True
else:
return False
df = df.sort_values('Date')
df = df[df.apply(custom_filter, axis = 1)]
df.to_csv('completed_output.csv')