【问题标题】:Join CSV Lines on Column X with python [duplicate]用python加入列X上的CSV行[重复]
【发布时间】:2015-04-22 10:13:23
【问题描述】:

有很多关于使用 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

因此,需要以这样一种方式连接行,即每行的项目都被合并,而“类别”项目是连接键,如果没有足够的匹配行,则可能会删除数据。 最好是拥有可变数量的文件,这样不仅可以合并(或合并)两个文件,而且可以通过这种方式合并(或合并)X 个文件。

有没有pythonic方法可以做到这一点?

【问题讨论】:

  • 在您的输出示例中,对于category1,您保留0,0,0,并丢弃1,1,1。这是否意味着您只想保留第一个匹配记录? ---稍后,您介绍了多个文件的主题:您是要仅基于第一个文件内容进行合并还是...您的问题不是一个明确的问题...您应该尝试更准确。跨度>
  • 很抱歉,如果这仍然不清楚。起初:是的,第一个匹配行很好。这就是为什么我不想使用 unix join 方法。第二:合并将基于在所有文件中找到的类别的最小条目数。如果类别 X 在 file1 中有 20 个实例,在 file2 中有 10 个实例,在 file3 中有 12 个实例,则组合文件中应该有 10 个实例。

标签: python csv join


【解决方案1】:

字典应该可以完成这项工作
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. 读取其他文件,如果字典包含类别,则更新值。

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 点的代码将导致每个类别只有一个值字典,因此对于上面的示例,您将得到 {'category1': {0: '1', 1: '1', 2: '1'}, 'category2': {0: '6', 1: '6', 2: '6'}, 'category4': {0: '9', 1: '9', 2: '9'}} 因此,如果与其他文件合并,每个类别只有一个实例。
【解决方案2】:

感谢您的启发灵感!

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

  1. 以这样的方式读取数据,即有一个以类别为键的字典和另一个字典为值的字典。这个“内部字典”将文件名作为键,将值作为值。

    data = {'category1' : {'file1' : [[a,b,c]], 'file2' : [[0,0,0],[1,1,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], ... }

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

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 2022-01-03
    • 1970-01-01
    • 2019-06-05
    • 2019-01-10
    • 2019-06-22
    • 1970-01-01
    • 2018-02-03
    • 2019-05-04
    相关资源
    最近更新 更多