使用python

时间:2015-04-22 10:13:24

标签: python csv join

有很多问题要求用python重新排列CSV文件,但我找不到以下问题的答案:

我希望以连接数据的方式“合并”特定列上的csv文件。这让我想起了一个SQL连接。 让我们说:

有许多csv文件看起来都一样。为简单起见,我们假设每行只有四个项目 - 三个数据项和一个类别。所以一个文件看起来像:

a,b,c,category1
e,f,g,category2
a,c,c,category3

另一个像:

0,0,0,category1
1,1,1,category1
5,5,5,category2
6,6,6,category2
9,9,9,category4

现在,我想合并这些文件以获得以下结果:

a,b,c,0,0,0,category1
e,f,g,5,5,5,category2

因此,需要以这样的方式连接行,即每个行的项目组合在一起,而“category”项是连接键,如果没有足够匹配的行,则可以删除该数据。 最好的方法是拥有可变数量的文件,这样不仅可以合并(或加入)两个文件,而且可以通过这种方式合并(或加入)。

有没有pythonic的方法来做到这一点?

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

词典词典应该做的工作 1.使用readlines()读取数据 2.使用类别作为键填充字典

dictionary = {}
for line in lines:
    entries = line.split(',')
    dictionary[entries[3]] = {}
    dictionary[entries[3]][0] = entries[0]
    dictionary[entries[3]][1] = entries[1]
    dictionary[entries[3]][2] = entries[2]
  1. 读取另一个文件,如果字典包含该类别,则更新值。
  2. for line in lines: entries = line.split(',') if entries[3] in dictionary: //populate accordingly dictionary[entries[3]][3] = entries[0] dictionary[entries[3]][4] = entries[1] dictionary[entries[3]][5] = entries[2]

答案 2 :(得分:0)

感谢您的灵感!

我想出了一个相当肮脏的方式:

  1. 以这样的方式读取数据,即类别为键,另一个dict为值。这个"内在的字典"将文件名作为键,将值作为值。

    data = {'category1' : {'file1' : [[a,b,c]], 'file2' : [[0,0,0],[1,1,1]] }

  2. 在另一个字典中,我存储了每个类别的最小实例数(让1对类别1说2):

    `limits = {"category1":2*len(infiles)*featuresinfiles,"category2": . . .}`
    

    现在我创建了一个字典" comb"包含组合:

    for c in data.keys(): if c not in comb.keys(): comb[c] = [] while len(comb[c]) < limits[c]: for f in data[c]: comb[c] += (data[c][f].pop(0))

    这最终给出了一个字典,其中类别为键,其组合值为值;在示例中:

    {'category1' : [a,b,c,0,0,0], ... }

    我确定有更好的方法可以做到这一点,但作为一种解决方法,这就是我想要的。