使用不同列

时间:2016-08-29 07:12:50

标签: python csv pandas duplicates

我在目录中有多个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=',')

对此有更简单的方法吗?

1 个答案:

答案 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])