根据两列中的值合并其他列中的值

2024-05-16 20:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由制表符分隔的文件,有四列。我需要为“col1”和“col2”中的每个唯一值对组合“col3”和“col4”。示例和输出如下所示。在

我想到的一种方法是使用嵌套循环:外部循环按顺序读取行,而内部循环从开始处读取所有行并查找map。然而,这个过程似乎是计算密集型的。在

有没有其他方法可以做这个。在

col1    col2    col3    col4
a   c   1,2 physical
a   c   2,3 genetic
b   c   22  physical 
b   d   33,44   genetic
c   e   1,2 genetic
c   e   2   physical
c   f   33,44   physical
c   f   3   genetic
a   a   4   genetic
e   c   1,2 xxxxx


col1    col2    col3    col4
a   c   1,2,3   genetic,physical
a   a   4   genetic
b   c   22  physical 
b   d   33,44   genetic
c   e   1,2 genetic,physical,xxxxx
c   f   3,33,44 genetic,physical

如果“col1”和“col2”按上面最后一行中的值“xxxxx”进行切换,则它将合并值


Tags: 文件方法示例map顺序过程制表符col2
2条回答

@mgilson给出了一个很好的无需额外零件的解决方案(+1)。我看到pandas也被标记了,所以为了完整起见,我将给出一个pandas等价物:

import pandas as pd

df = pd.read_csv("merge.csv",delimiter=r"\s*")

key_cols = ["col1", "col2"]
df[key_cols] = df[key_cols].apply(sorted, axis=1)

def join_strings(seq, key):
    vals = [term for entry in seq for term in entry.split(',')]
    return ','.join(sorted(set(vals), key=key))

new_df = df.groupby(key_cols).agg({"col3": lambda x: join_strings(x, int),
                                   "col4": lambda x: join_strings(x, str)})
new_df.to_csv("postmerged.csv")

产生

^{pr2}$

所有这些操作都是(1)对前两列进行排序,使e c变成{},(2)按col和{}对术语进行分组,然后通过逗号连接已排序的扁平项集来聚合(aggcol3和{}。在

groupby对于这样的事情确实很方便。也可能有一个内置的替代join_strings函数,但我不确定。在

我将创建一个键字典,它是保存column1和column2数据的元组。值将是一个包含第3列和第4列数据的列表。。。在

from collections import defaultdict
with open('test.dat') as f:
    data = defaultdict( lambda:([],[]))
    header = f.readline()
    for line in f:
        col1,col2,col3,col4 = line.split()
        col3_data,col4_data = data[(col1,col2)]  #data[frozenset((col1,col2))] if order doesn't matter
        col3_data.append(col3)
        col4_data.append(col4)

现在排序并编写输出(用','连接column3和column4列表,用setsorted进行唯一排序)

^{pr2}$

相关问题 更多 >