[英]Print all rows related to minimum values from another column based on distinct values of a specific column from csv file using python csv
[英]Read a .csv file and join values based on equal values in specific column
我有一个csv文件,其中包含三列(A,B和C),其值如下图所示: CSV表
1,2,4
1,257,5
1,258,6
1,8,7
1,260,8
2,24,9
2,26,10
2,234,11
3,14,12
3,22,13
3,78,14
我想通过“-”连接B列中的值,而A列中的值相同。 因此,预期输出如下:
[“ 2-257-258-8-260”,“ 24-26-234”,“ 14-22-78”]
谁能帮助我如何获得这些结果。
提前致谢
这是一个简单的Python解决方案。
我们使用csv
读取器读取数据。 在我的代码中,我从名为file_data
的行列表中读取,但是您可以将file_data
更改为打开的文件对象。
我们将数据存储到列表字典中,其中A列的值作为键,B列的值附加到列表中。
然后,我们按顺序遍历键,将B数据连接到所需形式的字符串中。
import csv
from collections import defaultdict
file_data = '''\
1,2,4
1,257,5
1,258,6
1,8,7
1,260,8
2,24,9
2,26,10
2,234,11
3,14,12
3,22,13
3,78,14
'''.splitlines()
reader = csv.reader(file_data)
data = defaultdict(list)
for a, b, c in reader:
#print(a, b, c)
data[a].append(b)
out = ['-'.join(data[k]) for k in sorted(data.keys())]
print(out)
输出
['2-257-258-8-260', '24-26-234', '14-22-78']
如果您的数据集采用以下格式:
A,B,C
1,2,4
1,257,5
1,258,6
1,8,7
1,260,8
2,24,9
2,26,10
2,234,11
3,14,12
3,22,13
3,78,14
您可以使用itertools.groupby()
对A
列中的项目进行分组,并结合B
列中的元素:
from csv import reader
from itertools import groupby
from operator import itemgetter
with open('data.csv') as in_file:
csv_reader = reader(in_file)
# skip headers
next(csv_reader)
# sort data by A column, then C column
sorted_data = sorted(csv_reader, key=itemgetter(0, 2))
# group by A column, and join by B column
grouped = ['-'.join(map(itemgetter(1), g)) for _, g in groupby(sorted_data, key=itemgetter(0))]
print(grouped)
哪些输出:
['2-257-258-8-260', '24-26-234', '14-22-78']
注意:此解决方案在分组之前先进行排序,以防万一数据尚未首先在A
列上排序,然后在C
列上排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.