我在目录中有多个CSV文件。有些包含更多列(可以删除)。
是否有一种优雅的方法可以在这些CSV文件之间对记录进行重复数据删除,并将列缩减为一组常见的列?
目前,我将使用python / pandas来实现这一目标。我将所有文件加载到一个数据框中,请注意另外一列,其中记录来自(文件名),删除其他列,最后通过http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.duplicated.html删除pandas重复数据删除 在最后一步中,我根据filename-identifier列将重复数据删除的文件写回磁盘。
# ASSUMPTION: files are in order, first file defines minimum common columns
path = '.'
files_in_dir = [f for f in os.listdir(path)if f.endswith('csv')]
isFirst = True
for filenames in fs.find('*.csv', path):
df = pd.read_csv(filenames, error_bad_lines=False)
df['origin'] = fs.add_suffix(filenames, '_deduplicated')
if (isFirst):
isFirst = False
bigDf = df
else:
bigDf = pd.concat(bigDf, df, axis=0, join='inner')
cols_for_dup = [col for col in bigDf.columns if col not in ['origin']]
bigDf.duplicated(subset=cols_for_dup).sum()
bigDf.duplicated().sum()
bigDf_withoutNA = bigDf.drop_duplicates(keep='first', subset= cols_for_dup)
grouped = bigDf_withoutNA.groupby('origin')
for name, group in grouped:
#filename = 'path' + name
group.to_csv(path_or_buf= name, sep=';', decimal=',')
对此有更简单的方法吗?
答案 0 :(得分:1)
我不知道如何让它变得更简单。对于我的一些数据,我有一个相同的脚本。它只运行两次,首先确定所有文档中的最小/最大列,最后重写新文件夹中的csv文件,以保留原始数据。
我只是使用python的csv lib。 https://docs.python.org/2/library/csv.html
此脚本中没有检查,因为它只是一个快速而肮脏的脚本。
重复数据删除尚未完成。它只是将所有数据切换到相同的长度,但您可以用重复数据删除代码替换最后一行。
import os
import csv
mincols = 0xffffffff
maxcols = 0
srcdir = '/tmp/csv/'
dstdir = '/tmp/csv2/'
for dirName, subdirList, fileList in os.walk(srcdir):
for fname in fileList:
if fname[-4:].lower() == '.csv':
with open(os.path.join(dirName, fname)) as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
if mincols > len(row):
mincols = len(row)
if maxcols < len(row):
maxcols = len(row)
print(mincols, maxcols)
for dirName, subdirList, fileList in os.walk(srcdir):
for fname in fileList:
if fname[-4:].lower() == '.csv':
fullpath = os.path.join(dirName, fname)
newfile = os.path.join(dstdir, fullpath[len(srcdir):])
if not os.path.exists(os.path.dirname(newfile)):
os.makedirs(os.path.dirname(newfile))
with open(fullpath) as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
with open(newfile, 'w') as dstfile:
writer = csv.writer(dstfile, delimiter=',', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
for row in reader:
#You can deduplicate here
writer.writerow(row[:mincols])