如何在列中使用具有相同值的python中的CSV并创建具有唯一值的新CSV

时间:2018-10-31 07:52:08

标签: python csv parsing

我要面对的问题是,我有一个csv文件,其中一个数据包含多个列(此处为unique_code),并且我想创建一个新的csv,该列的数据只有此列的一倍,而其他列中的数据如果不同则以空格分隔(此处为alternate_code)。

这是我的csv。

唯一代码说明替代代码

33;product1;58

43;product2;95

33;product1;62

68;product3;11

43;product2;99

我想要的csv结果:

33;product1;58 62

43;product2;95 99

68;product3;11

关于如何实现新的csv的任何想法?

4 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

concurrently "command1 arg" "command2 arg"

答案 1 :(得分:0)

import csv

with open("my_file.csv", 'r') as fd:
    #import csv as list of list and remove blank line                
    data = [i for i in csv.reader(fd, delimiter=';') if i]                                       
    result = []
    for value in data:
        #check if product not in result 
        if value[1] not in [r[1] for r in result if r]:
            #add the new product to result with all values for the same product 
            result.append([value[0],
                           value[1],
                           ' '.join([line[2] for line in data if line[1] == value[1]])
                         ])
    print(result)

答案 2 :(得分:0)

最后我得到了这个解决方案:

# -*- coding: utf-8 -*-
import csv

input_file_1 = "eidi.csv"
output_file = "output.csv"

parsed_dictionary={}

def concatenate_alter_codes(alter_code_list):
    result = ""
    for alter_code in alter_code_list:
        result = result + (alter_code + " ")
        print result
    return result[:-1]

#Read input csv file and create a dictionary with a list of all alter codes
with open(input_file_1,'r') as f:
    # put ; symbol as delimeter
    input_csv=csv.reader(f,delimiter=';')
    for row in input_csv:
        # if the key exists in the dictionary
    if row[0] in parsed_dictionary:
        parsed_dictionary[row[0]][0].append(row[2])
    else:
        parsed_dictionary[row[0]] = [[row[2]], row[1], row[3], row[4], row[5], row[6]]

#create new csv file with concatenated alter codes

with open(output_file,'w') as f:
    for key in parsed_dictionary:
                f.write(key + ";" + concatenate_alter_codes(parsed_dictionary[key][0]) + ";" + parsed_dictionary[key][1] + ";" + parsed_dictionary[key][2] + ";" + parsed_dictionary[key][3] + ";" + parsed_dictionary[key][4] + ";" + parsed_dictionary[key][5] + "\n")

答案 3 :(得分:0)

littletable是我几年前写的一个瘦CSV包装器。 littletable中的表是对象列表,带有一些用于过滤,联接,数据透视的辅助方法,以及轻松导入/导出CSV,JSON和固定格式数据的方法。像熊猫一样,它有助于数据的导入/导出,但不具有熊猫具有的所有其他数字分析功能。它还将所有数据作为Python对象列表保存在内存中,因此它不会像熊猫那样处理数百万行。但是,如果您的需求适中,那么使用littletable可能会缩短学习时间。

要将初始原始数据加载到littletable表中,首先需要:

import littletable as lt
data = open('raw_data.csv')
tt = lt.Table().csv_import(data, fieldnames="id name altid".split(), delimiter=';')

(如果输入文件中包含标题行,则csv_import将使用该标题行,而不要求您指定fieldnames。)

打印出行就像遍历列表一样:

for row in tt:
    print(row)

打印:

{'name': 'product1', 'altid': '58', 'id': '33'}
{'name': 'product2', 'altid': '95', 'id': '43'}
{'name': 'product1', 'altid': '62', 'id': '33'}
{'name': 'product3', 'altid': '11', 'id': '68'}
{'name': 'product2', 'altid': '99', 'id': '43'}

由于我们将对id属性进行分组和加入,因此我们添加了一个索引:

tt.create_index("id")

(也可以创建唯一索引,但在这种情况下,原始输入中的重复值具有相同的ID。)

可以按一个或多个属性对表进行分组,然后可以将每组记录传递给一个函数以提供该组的汇总值。对于您的情况,您希望每个产品altids收集的所有id

def aggregate_altids(rows):
    return ' '.join(set(row.altid for row in rows if row.altid != row.id))
grouped_altids = tt.groupby("id", altids=aggregate_altids)

for row in grouped_altids:
    print(row)

礼物:

{'altids': '62 58', 'id': '33'}
{'altids': '99 95', 'id': '43'}
{'altids': '11', 'id': '68'}

现在,我们将该表与tt上的原始id表联接起来,并折叠出重复项:

tt2 = (grouped_altids.join_on('id') + tt)().unique("id")

并打印出结果:

for row in tt2:
    print("{id};{name};{alt_ids}".format_map(vars(row)))

给予:

33;product1;58 62
43;product2;95 99
68;product3;11

未经调试的总代码如下:

# import
import littletable as lt
with open('raw_data.csv') as data:
    tt = lt.Table().csv_import(data, fieldnames="id name altid".split(), delimiter=';')
tt.create_index("id")

# group
def aggregate_altids(rows):
    return ' '.join(set(row.altid for row in rows if row.altid != row.id))
grouped_altids = tt.groupby("id", alt_ids=aggregate_altids)

# join, dedupe, and sort
tt2 = (grouped_altids.join_on('id') + tt)().unique("id").sort("id")

# output
for row in tt2:
    print("{id};{name};{alt_ids}".format_map(vars(row)))