我要面对的问题是,我有一个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的任何想法?
答案 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)))