通过 python 在 csv 文件的两列数据之间创建不同的组合/模式

Create different combination / patterns between the data of two columns of a csv file by python

我有一个包含 5 列的 .csv 文件,a_id、b_id、var、lo、up。我想根据 a_id、b_id 和 var.

在两个变量之间创建不同的组合/模式

另外,一开始我想根据a_id,b_id删除没有重复的记录,因为如果没有重复,就不会创建组合或匹配.结果,在 dataFile.csv 中,第一条记录被删除,因为它没有重复项。

对于两个变量之间的组合/模式,首先我想在每个 a_id 和 b_id 的每个记录上创建单个组合。在这种情况下,第二个变量的值为空。这可以显示在结果文件中。例如,如果我从记录 2 到 5 创建不同的组合/模式,这意味着 a_id = 103 和 b_id = 195,结果可以在 resultFile 中看到。以相同的方式,其他基于 a_id、b_id 和 var 的组合/模式将被创建为 resultFile.csv。在result文件中,变量名中的1、2、3只是用来标识变量,在resultFile中通常不需要。此外,我为每个模式使用了一个空白行,resultFile 中也不需要它。我用它只是为了清楚地看到模式。 我已经展示了基于 a_id 和 b_id 的两个变量的不同组合。我有不同的 a_id 和不同的 b_id 真实数据。

任何意见和建议都将不胜感激。

dataFile.csv.

   
a_id      b_id      var      lo      up
103       190       dwel     0       236

103       195       ses      1       3
103       195       ses      4       113
103       195       pv       1       5
103       195       pv       6       29

103       266       dwl      15      92
103       266       dwl      93      144
103       266       dwl      145     521
103       266       ses      1       2
103       266       ses      3       6
103       266       pv       1       2
103       266       pv       3       9
103       266       pv       10      23
103       266       pv       24      33
103       266       Elp      142     711
103       266       Elp      711     885

107       272       dwl      15      95
107       272       dwl      96      624
107       272       ses      1       2
107       272       ses      3       6
107       272       pv       1       2
107       272       pv       3       9
.         .         .        .       .
.         .         .        .       .

resultFile.csv.

resultFile.csv应该是这样的:

   
a_id    b_id    var1    lo    up    var2    lo      up
103     195     ses1    1     3     null    null    null
103     195     ses2    4     113   null    null    null
103     195     pv1     1     5     null    null    null
103     195     pv2     6     29    null    null    null
103     195     ses1    1     3     pv1     1       5
103     195     ses1    1     3     pv2     6       29
103     195     ses2    4     113   pv1     1       5
103     195     ses2    4     113   pv2     6       29

103     266     dwl1    15    92    null    null    null
103     266     dwl2    93    144   null    null    null
103     266     dwl3    145   521   null    null    null
103     266     ses1    1     2     null    null    null
103     266     ses2    3     6     null    null    null
103     266     pv1     1     2     null    null    null
103     266     pv2     3     9     null    null    null
103     266     pv3     10    23    null    null    null
103     266     pv4     24    103   null    null    null
103     266     elp1    142   711   null    null    null
103     266     elp2    712   885   null    null    null
103     266     dwl1    15    92    ses1    1       2
103     266     dwl1    15    92    ses2    3       6
103     266     dwl2    993   144   ses1    1       2
103     266     dwl2    993   144   ses2    3       6
103     266     dwl3    145   521   ses1    1       2
103     266     dwl3    145   521   ses2    3       6
103     266     dwl1    15    92    pv1     1       2
103     266     dwl1    15    92    pv2     3       9
103     266     dwl1    15    92    pv3     10      23
103     266     dwl1    15    92    pv4     24      33
103     266     dwl2    993   144   pv1     1       2
103     266     dwl2    993   144   pv2     3       9
103     266     dwl2    993   144   pv3     10      23
103     266     dwl2    993   144   pv4     24      33
103     266     dwl3    145   521   pv1     1       2
103     266     dwl3    145   521   pv2     3       9
103     266     dwl3    145   521   pv3     10      23
103     266     dwl3    145   521   pv4     24      33
103     266     dwl1    15    92    elp1    142     711
103     266     dwl1    15    92    elp2    712     885
103     266     dwl2    993   144   elp1    142     711
103     266     dwl2    993   144   elp2    712     885
103     266     dwl3    145   521   elp1    142     711
103     266     dwl3    145   521   elp2    712     885
103     266     ses1    1     2     pv1     1       2
103     266     ses1    1     2     pv2     3       9
103     266     ses1    1     2     pv3     10      23
103     266     ses1    1     2     pv4     24      33
103     266     ses2    3     6     pv1     1       2
103     266     ses2    3     6     pv2     3       9
103     266     ses2    3     6     pv3     10      23
103     266     ses2    3     6     pv4     24      33
103     266     ses1    1     2     dwl1    615     992
103     266     ses1    1     2     dwl2    993     144
103     266     ses1    1     2     dwl3    145     210
103     266     ses2    3     6     dwl1    615     992
103     266     ses2    3     6     dwl2    993     144
103     266     ses2    3     6     dwl3    145     210
103     266     ses1    1     2     elp1    142     711
103     266     ses1    1     2     elp2    712     885
103     266     ses2    3     6     elp1    142     711
103     266     ses2    3     6     elp2    712     885
103     266     elp1    142   711   pv1     1       2
103     266     elp1    142   711   pv2     3       9
103     266     elp1    142   711   pv3     10      23
103     266     elp1    142   711   pv4     24      33
103     266     elp2    712   885   pv1     1       2
103     266     elp2    712   885   pv2     3       9
103     266     elp2    712   885   pv3     10      23
103     266     elp2    712   885   pv4     24      33
103     266     elp1    142   711   ses1    1       2
103     266     elp1    142   711   ses2    3       6
103     266     elp2    712   885   ses1    1       2
103     266     elp2    712   885   ses2    3       6
103     266     elp1    142   711   dwl1    615     992
103     266     elp1    142   711   dwl2    993     144
103     266     elp1    142   711   dwl3    145     210
103     266     elp2    712   885   dwl1    615     992
103     266     elp2    712   885   dwl2    993     144
103     266     elp2    712   885   dwl3    145     210
103     266     pv1     1     2     dwl1    615     992
103     266     pv1     1     2     dwl2    993     144
103     266     pv1     1     2     dwl3    145     210
103     266     pv2     3     9     dwl1    615     992
103     266     pv2     3     9     dwl2    993     144
103     266     pv2     3     9     dwl3    145     210
103     266     pv3     10    23    dwl1    615     992
103     266     pv3     10    23    dwl2    993     144
103     266     pv3     10    23    dwl3    145     210
103     266     pv4     24    33    dwl1    615     992
103     266     pv4     24    33    dwl2    993     144
103     266     pv4     24    33    dwl3    145     210
103     266     pv1     1     2     ses1    1       2
103     266     pv1     1     2     ses2    3       6
103     266     pv2     3     9     ses1    1       2
103     266     pv2     3     9     ses2    3       6
103     266     pv3     10    23    ses1    1       2
103     266     pv3     10    23    ses2    3       6
103     266     pv4     24    33    ses1    1       2
103     266     pv4     24    33    ses2    3       6
103     266     pv1     1     2     elp1    142     711
103     266     pv1     1     2     elp2    712     885
103     266     pv2     3     9     elp1    142     711
103     266     pv2     3     9     elp2    712     885
103     266     pv3     10    23    elp1    142     711
103     266     pv3     10    23    elp2    712     885
103     266     pv4     24    33    elp1    142     711
103     266     pv4     24    33    elp2    712     885

以下 Python 解决方案应该可以帮助您入门:

from itertools import groupby, product
import csv

output_header = ["a_id", "b_id", "var1", "lo", "up", "var2", "lo", "up"]

f_input = open('dataFile.csv', 'rb')
csv_input = csv.reader(f_input)
input_header = next(csv_input)

f_output = open('resultFile.csv', 'wb')
csv_output = csv.writer(f_output)
csv_output.writerow(output_header)


for k1, g1 in groupby(csv_input, key=lambda x: (x[0], x[1])):
    group1 = list(g1)

    if len(group1) > 1:
        for row in group1:
            csv_output.writerow(row + ['null'] * 3)

        p = [list(g2) for k2, g2 in groupby(group1, key=lambda x: x[2])]

        for pairs in product(*p):
            if len(pairs) > 1:
                csv_output.writerow(pairs[0] + pairs[1][2:])

f_input.close()
f_output.close()

这将为您提供一个 resultFile.csv 文件,开头如下:

a_id,b_id,var1,lo,up,var2,lo,up
103,195,ses,1,3,null,null,null
103,195,ses,4,113,null,null,null
103,195,pv,1,5,null,null,null
103,195,pv,6,29,null,null,null
103,195,ses,1,3,pv,1,5
103,195,ses,1,3,pv,6,29
103,195,ses,4,113,pv,1,5
103,195,ses,4,113,pv,6,29
103,266,dwl,15,92,null,null,null
103,266,dwl,93,144,null,null,null
103,266,dwl,145,521,null,null,null
...

使用 Python 2.6.6 进行测试(我相信 OP 正在使用)