Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接在Python中具有相同第1列值的CSV文件的所有行_Python_Csv - Fatal编程技术网

连接在Python中具有相同第1列值的CSV文件的所有行

连接在Python中具有相同第1列值的CSV文件的所有行,python,csv,Python,Csv,我有一个类似以下内容的CSV文件: def join_rows(rows): def join_tuple(tup): for x in tup: if x: return x else: return '' return [join_tuple(x) for x in zip(*rows)] [Name1]、、、、、、、、、、、、、、、、、、、、、、、、、、, “

我有一个类似以下内容的CSV文件:

def join_rows(rows):
    def join_tuple(tup):
        for x in tup:
            if x: 
                return x
        else:
            return ''
    return [join_tuple(x) for x in zip(*rows)]
[Name1]、、、、、、、、、、、、、、、、、、、、、、、、、、, “,”,“,”,“+”]
['Name1','','','','','','','','','','','','','','','',b','','', , , '','','','','','','','','','','','','','','','','','','','', “,”,“,”,“,”,”,“,”)

现在,我需要一种方法将具有相同第一列名的所有行连接到一列中,例如:

[Name1]、、、、、、、、、、、、、、、、、、、、、、、、、, '','','',''+']
['Name2','','',', , '','','','','','','','','','','','','','','','','','','','', “,”,“,”,“,”,”,“,”)

我可以想出一种方法,对CSV进行排序,然后遍历每一行和每一列,比较每一个值,但可能有一种更简单的方法

有什么想法吗

def merge_rows(row1, row2):
    # merge two rows with the same name
    merged_row = ...
    return merged_row

r1 = ['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+']
r2 = ['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
r3 = ['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '']
r4 = ['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
rows = [r1, r2, r3, r4]
data = {}
for row in rows:
    name = row[0]
    if name in data:
        data[name] = merge_rows(row, data[name])
    else:
        data[name] = row
现在,您拥有了
数据中的所有行,其中此字典的每个键都是名称,对应的值就是该行。您现在可以将此数据写入CSV文件


现在,您拥有了
数据中的所有行,其中此字典的每个键都是名称,对应的值就是该行。您现在可以将此数据写入CSV文件。

您应该使用itertools.groupby:

t = [ 
['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+'],
['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],
['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', ''],
['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
]

from itertools import groupby

# TODO: if you need to speed things up you can use operator.itemgetter
# for both sorting and grouping
for name, rows in groupby(sorted(t), lambda x:x[0]):
    print join_rows(rows)
很明显,您将在一个单独的函数中实现合并。例如:

def join_rows(rows):
    def join_tuple(tup):
        for x in tup:
            if x: 
                return x
        else:
            return ''
    return [join_tuple(x) for x in zip(*rows)]

您应该使用itertools.groupby:

t = [ 
['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+'],
['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],
['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', ''],
['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
]

from itertools import groupby

# TODO: if you need to speed things up you can use operator.itemgetter
# for both sorting and grouping
for name, rows in groupby(sorted(t), lambda x:x[0]):
    print join_rows(rows)
很明显,您将在一个单独的函数中实现合并。例如:

def join_rows(rows):
    def join_tuple(tup):
        for x in tup:
            if x: 
                return x
        else:
            return ''
    return [join_tuple(x) for x in zip(*rows)]

您还可以使用
defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> _ = [d[i[0]].append(z) for i in t for z in i[1:]]
>>> d['Name1']
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

然后加入你的专栏

你也可以使用
defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> _ = [d[i[0]].append(z) for i in t for z in i[1:]]
>>> d['Name1']
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', '']


然后进行列联接

这听起来是最合乎逻辑的方式。您可能应该更明确地说明联接应该做什么。同一列是否可以以相同的第一个值出现在两行中?在这种情况下,你想做什么?@moooeeep:好吧,我想加入他们,这样他们就像例子的第二部分一样。@CharlesBrunet:不,对于同一名称,一个值只能在其他列中的一列中为每列显示一次。这听起来是最符合逻辑的做法。您可能应该更明确地说明join应该执行的操作。同一列是否可以在两行中以相同的第一个值显示?在这种情况下,你想做什么?@moooeeep:嗯,我想加入它们,使它们与示例的第二部分类似。@CharlesBrunet:不,对于相同的名称,每个列只能在其他列中出现一次值。嗨,谢谢Simeon:我不明白合并行部分发生了什么。具有相同名称的前一行(或多行)存储在何处,以便我可以合并它们?您正在处理的当前行是
row
,另一行是
data[name]
data[name]
中的行可以是具有该名称的前一行,也可以是具有该名称的行的一个或多个合并的结果。因此,您只需要编写指定如何合并具有相同名称的两行的代码。如果您为
merged\u row
编写代码,那么它将重复合并行(即使有三行或更多行具有相同的名称)。我已经更新了代码,使其有点清除。您只需编写
merge_rows
来指定如何合并同名的两行。您好,谢谢Simeon:我不明白合并行部分发生了什么。具有相同名称的前一行(或多行)存储在何处,以便我可以合并它们?您正在处理的当前行是
row
,另一行是
data[name]
data[name]
中的行可以是具有该名称的前一行,也可以是具有该名称的行的一个或多个合并的结果。因此,您只需要编写指定如何合并具有相同名称的两行的代码。如果您为
merged\u row
编写代码,那么它将重复合并行(即使有三行或更多行具有相同的名称)。我已经更新了代码,使其有点清除。您只需编写
merge\u rows
来指定如何合并同名的两行。这不起作用。它是join_rows一个来自某个库的函数,或者是我必须在代码之外编写的东西?@jbssm
join_rows
是您代码的入口点,您可以编写;)@MooEEEP不使用不带键的
sorted
,这是不必要的运行时。@MooEEEP
itemgetter(0)
将是一种更好的方法(请参阅),因此它看起来像:
对于名称,groupby中的行(排序(t,key=itemgetter(0)),itemgetter(0))
它不起作用。它是join_rows一个来自某个库的函数,或者是我必须在代码之外编写的东西?@jbssm
join_rows
是您代码的入口点,您可以编写;)@MooEEEP不使用不带键的
sorted
,这是不必要的运行时。@MooEEEP
itemgetter(0)
将是一种更好的方法(请参阅),因此它看起来像:
对于名称,groupby中的行(sorted(t,key=itemgetter(0)),itemgetter(0))