Python在CSV中合并具有单个重复字段的行的最有效方法是什么?

2024-05-19 00:20:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我也发现了一些类似的问题,但是我认为可以解决的答案太复杂了,我无法转变成我需要的东西。我需要一些帮助来了解如何在Python中完成以下任务:

我有一个包含三列数据的CSV文件。在第一列中,我有重复的值(与其他行中的duplicated一样),我需要将这些值与第二列和第三列中的特定数据合并为一行。结果应该是另一个CSV。在

此外,对于具有重复列1数据的每一组行,第2列和第3列中的数据有许多情况需要合并。换言之,对于第一列值的任何第一个实例,如果第二列中的值不为空,则获取它并将其放入第二列的“final”行中;否则,如果第二列为空,则在第三列中获取值并将其放入第三列的“final”行中。我需要实现的规则是:column1值的第一个和最后一个实例需要合并第二列和第三列中存在的任何数据,同时维护第二列中的第二列数据和第三列中的第三列数据。而且,在给定的源CSV行中从来没有三个完整的值。在

为了更好地解释,以下是源CSV中列出的数据: 以下是源CSV中需要合并的行集合的示例:

示例1:这里有四行与第一列数据相匹配,对于所有示例,我需要结果是一行包含列1值,后跟列1值的第一个和最后一个实例中的值。在

wp.xyz03.def02.01195.1,wp03.xyz03-c01_lc08_m00,
wp.xyz03.def02.01195.1,wp02.xyz03,
wp.xyz03.def02.01195.1,,wp01.def02
wp.xyz03.def02.01195.1,,wp02.def02-c02_lc14_m00

因此,该组的期望结果是:

^{pr2}$

示例2:这里我有三行与第一列的数据相匹配,同样我需要结果是一行包含列1的值,后跟列1值的第一个和最后一个实例中的值。在

wp.atl21.lmn01.01193.2,wp03.atl21-c06_lc14_m00,
wp.atl21.lmn01.01193.2,wp02.atl21,
wp.atl21.lmn01.01193.2,,wp03.lmn01

因此,该组的期望结果是:

wp.atl21.lmn01.01193.2,wp03.atl21-c06_lc14_m00,wp03.lmn01

示例3:这里我有三行与第一列的数据相匹配,同样我需要结果是一行包含列1的值,后跟列1值的第一个和最后一个实例中的值。注意:这个例子看到第一行现在在第二列中没有值,而在第三列中却没有所需的值。在

tp.ghi03.ghi05.02194.65,,tp05.ghi05:1
tp.ghi03.ghi05.02194.65,tp05.ghi03:2,
tp.ghi03.ghi05.02194.65,tp05.ghi03-c06_lc11_m00,

因此,该组的期望结果是:

tp.ghi03.ghi05.02194.65,tp05.ghi03-c06_lc11_m00,tp05.ghi05:1

综合起来:

这个:

wp.xyz03.def02.01195.1,wp03.xyz03-c01_lc08_m00,
wp.xyz03.def02.01195.1,wp02.xyz03,
wp.xyz03.def02.01195.1,,wp01.def02
wp.xyz03.def02.01195.1,,wp02.def02-c02_lc14_m00
wp.atl21.lmn01.01193.2,wp03.atl21-c06_lc14_m00,
wp.atl21.lmn01.01193.2,wp02.atl21,
wp.atl21.lmn01.01193.2,,wp03.lmn01
tp.ghi03.ghi05.02194.65,,tp05.ghi05:1
tp.ghi03.ghi05.02194.65,tp05.ghi03:2,
tp.ghi03.ghi05.02194.65,tp05.ghi03-c06_lc11_m00,

需要变成这样:

wp.xyz03.def02.01195.1,wp03.xyz03-c01_lc08_m00,wp02.def02-c02_lc14_m00
wp.atl21.lmn01.01193.2,wp03.atl21-c06_lc14_m00,wp03.lmn01
tp.ghi03.ghi05.02194.65,tp05.ghi03-c06_lc11_m00,tp05.ghi05:1

我已经尝试了很多方法来达到这个目的,但是如果不迅速进入一个非常陌生的领域,我就无法达到预期的效果。在

这是我最初的尝试,结果是当我达到三个值时,它会切断一些必要的值,并且永远不会发现可能还有另一个值:

reader = csv.reader(open('parse_lur_luraz_clean_temp.csv', 'r'), delimiter=',')
final = ['-','-','-']
parselur = ['-']
lur_a = ""
lur_z = ""
for row in reader:
    if row[0] != parselur[0]:
        final = ['-','-','-']
        if row[1] != '': lur_a = row[1]
        if row[2] != '': lur_z = row[2]
        parselur[0] = row[0]
    elif row[0] == parselur[0]:
        if row[1] == '':
            lur_a = row[1]
        elif row[1] != '':
            lur_a = row[1]
        if row[2] == '':
            lur_z = row[2]
        elif row[2] != '':
            lur_z = row[2]
        parselur[0] = row[0]
    if parselur[0] != '' and parselur[0] not in final: final[0] = parselur[0]
    if lur_a != '': 
        if final[1] == '-' or '_lc' not in final[1]: final[1] = lur_a
        lur_a = ''
    if lur_z != '': 
        if final[2] == '-' or '_lc' not in final[2]: final[2] = lur_z
        lur_z = ''
    if len(final) == 3 and '-' not in final:
        fd = open('final_alu_nsn_temp.csv','a')
        writer = csv.writer(fd)
        writer.writerow((final))
        fd.close()
        final = ['-','-','-']
    else:
        parselur[0] = row[0]

Tags: 数据iffinalrowwptpc06atl21
2条回答

如果我明白你想做什么,就给我一些伪代码:

Read each line:
Split by comma
Add each section to a large list

Next

Until list is empty:

Foreach value in the list:
Write value to file, then write a comma
Search a list, and remove duplicate values

好像是这样吗?我可以给你写一个python程序,如果这是你想要的

编辑:

我写了一个程序,据我所知,你给我的示例输入变成了示例输出

^{pr2}$

如果你有什么问题可以问

现在是学习^{}的最佳时机:

import csv
from itertools import groupby

# assuming Python 2
with open("source.csv", "rb") as fp_in, open("final.csv", "wb") as fp_out:
    reader = csv.reader(fp_in)
    writer = csv.writer(fp_out)
    grouped = groupby(reader, lambda x: x[0])
    for key, group in grouped:
        rows = list(group)
        rows = [rows[0], rows[-1]]
        columns = zip(*(r[1:] for r in rows))
        use_values = [max(c) for c in columns]
        new_row = [key] + use_values
        writer.writerow(new_row)

生产

^{pr2}$

相关问题 更多 >

    热门问题