比较CSV与行的乘数为6的倍数

时间:2017-04-28 07:30:29

标签: python csv

我有两个CSV文件,其行为n的倍数为6,我想比较它们。如果CSV1中的行与CSV2中的列1到3具有相同的值,但它们的列4值不同,请将CSV1中的第4列替换为CSV2中的第4列。到目前为止,我已经编写了下面的代码,它读取两个CSV并将它们分组为6(s),但我不知道接下来要做什么,因为它导致列表的列表,我无法处理。 N.B一个CSV的行数多于另一个。

我的代码:

import csv

def datareader(datafile):

    with open(datafile, 'r') as f:

        reader = csv.reader(f)
        next(reader, None)
        List1 = [lines for lines in reader]

    return [List1[pos:pos + 6] for pos in xrange(0, len(List1), 6)]

list1 = datareader('CSV1.csv')


def datareader1(datafile):

    # Read the csv
    with open(datafile, 'r') as f:

        reader = csv.reader(f)
        next(reader, None)
        List2 = [lines for lines in reader]

    return [List2[pos:pos + 6] for pos in xrange(0, len(List2), 6)]

list2 = datareader1('CSV2.csv')

CSV1

frm to  grp dur
192 177 1   999999
192 177 2   749
192 177 3   895
192 177 4   749
192 177 5   749
192 177 6   222222
192 178 1   222222
192 178 2   222222
192 178 3   222222
192 178 4   222222
192 178 5   1511
192 178 6   999999
192 179 1   999999
192 179 2   387
192 179 3   969
192 179 4   387
192 179 5   387
192 179 6   999999

CSV2

from_BAKCode    to_BAKCode  interval    duration
192 177 1   999999
192 177 2   749
192 177 3   749
192 177 4   749
192 177 5   749
192 177 6   999999
192 178 1   999999
192 178 2   999999
192 178 3   999999
192 178 4   999999
192 178 5   1511
192 178 6   999999

1 个答案:

答案 0 :(得分:1)

您可以使用pandas模块来处理数据操作。这会容易得多。

import pandas as pd

def add_new_dur(row):
    if row['dur'] == row['duration']: return row['dur']
    else: return row['duration']

fileNameCSV1 = 'csv1.csv'
fileNameCSV2 = 'csv2.csv'

df = dict()
for f in [fileNameCSV1, fileNameCSV2]:
    df[f.split('.')[0]] = pd.read_csv(f)

result = df['csv1'].merge(df['csv2'],
                          left_on = ['frm', 'to', 'grp'],
                          right_on = ['from_BAKCode', 'to_BAKCode', 'interval'])

result['new_dur'] = result.apply(add_new_dur, axis=1)

result = result[['frm', 'to', 'grp', 'new_dur']]

result = result.rename(columns={'new_dur':'dur'})

结果将如下所示。

    frm to  grp dur
0   192 177 1   999999
1   192 177 2   749
2   192 177 3   749
3   192 177 4   749
4   192 177 5   749
5   192 177 6   999999
6   192 178 1   999999
7   192 178 2   999999
8   192 178 3   999999
9   192 178 4   999999
10  192 178 5   1511
11  192 178 6   999999

如果你有一个csv文件比其他csv文件有更多行,那么额外的行将被省略。

希望它有所帮助。