【问题标题】:Python to do data matching and mergingPython做数据匹配和合并
【发布时间】:2013-08-10 18:04:21
【问题描述】:

输入文件是一个制表符分隔的 unicode txt

a  A   e  f  m
b  B   g  h
c  C   i  j
b  B   k  l

我想按第一列和第二列进行匹配并合并。所以我想得到

a  A   e  f  m
b  B   g  h     k  l
c  C   i  j

代码必须检测输入中的最大列数。因为在这个例子中是 5,所以“k l”是从第 6 列开始的。

实际上,当它们都是数字时,我几乎可以使用 Matlab 做到这一点。但是哦,当它们是字母时,Matlab 在处理 unicode 方面非常糟糕,尽管我读了 stackoverflow 关于如何在 Matlab 中处理 unicode 我放弃了。所以我现在转向 python。

使用 excel VBA,这似乎是可行的,但由于数据量太大,所以我猜 python 会比 Excel VBA 快(我猜对了吗?)

【问题讨论】:

  • 这是一个非常简单的练习 awk: awk -F\t '{a=$1 "\t" $2; $1=$2=""; x[a] = x[a] $0} END {for(y in x) print y,x[y]}'
  • @Nirk 根据 stackoverflow 指南,您的答案不应作为评论发布,请参阅stackoverflow.com/help/privileges/comment
  • @MadanRam 这不是一个答案,因为问题涉及 python,我没有给出 python 答案。最好将其作为注释放置,除非 user2604484 认为 awk 是可接受的解决方案
  • @Nirk 哦,非常感谢。我不知道有这种类型的解决方案。由于您没有将其发布为答案,因为我没有专门询问 awk,因此我在 stackoverflow.com/questions/18168664/… 上发布了一个类似的问题,您在那里有答案吗?再次感谢。

标签: python excel vba


【解决方案1】:

我会亲自将输入/处理逻辑与输出/格式化逻辑分开。

def match_merge(filename):
    with open(filename) as f:
        c = csv.reader(f,delimiter='\t')
        d = defaultdict(list)
        for line in c:
            d[(line[0],line[1])].append(line[2:])
    return d

演示:

In [17]: import pprint

In [18]: pprint.pprint(match_merge('tabdelim'))
{('a', 'A'): [['e', 'f', 'm']],
 ('b', 'B'): [['g', 'h'], ['k', 'l']],
 ('c', 'C'): [['i', 'j']]}

您可以使用match_merge 返回的dict(实际上是defaultdict)并将其轻松写入制表符分隔符文件。由于我并不真正了解您的输出需求,因此我省略了该部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多