如何在Python中合并具有相同ID的多个列表中的元素?

时间:2019-08-15 10:20:41

标签: python pandas dataframe

我有一个需要处理670,000 +行的文本文件。 每行的格式为:

uid, a, b, c, d, x, y, x1, y1, t, 0,

我做了一些清理,并将每一行转移到一个列表中:

[uid,(x,y,t)]

我的问题是:如何合并不同列表中的(x,y,t)元组,但是有效地拥有公共uid?

例如: 我有多个列表

[uid1,(x1,y1,t1)]
[uid1,(x2,y2,t2)]
[uid2,(x3,y3,t3)]
[uid3,(x4,y4,t4)]
[uid2,(x5,y5,t5)]
......

我想将它们转移到:

[uid1,(x1,y1,t1), (x2,y2,z2)]
[uid2,(x3,y3,t3), (x5,52,z5)]
[uid3,(x4,y4,t4)]
......

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

您可以使用groupby中的itertools方法。考虑到您的原始列表位于名为lists的变量中:

from itertools import groupby

lists = sorted(lists) # Necessary step to use groupby
grouped_list = groupby(lists, lambda x: x[0])
grouped_list = [(x[0], [k[1] for k in list(x[1])]) for x in grouped_list]      

答案 1 :(得分:1)

只需使用defaultdict

import collections

def group_items(items):
    grouped_dict = collections.defaultdict(list)
    for item in items:
        uid = item[0]
        t = item[1]
        grouped_dict[uid].append(t)

    grouped_list = []
    for uid, tuples in grouped_dict.iteritems():
        grouped_list.append([uid] + tuples)

    return grouped_list

items是您的初始列表的列表。 grouped_list将是uid分组列表的列表。

答案 2 :(得分:0)

如果数据存储在数据框中,则可以使用.groupby按'uid'进行分组,如果将值(x,t,v)转换为元组((x,t,v),),您可以.sum(即连接它们)。

这是一个例子:

df = pd.DataFrame.from_records(
    [['a',(1,2,3)],
    ['b',(1,2,3)],
    ['a',(10,9,8)]], columns = ['uid', 'foo']
)

df.apply({'uid': lambda x: x, 'foo': lambda x: (x,)}).groupby('uid').sum()

在我看来,它产生了:

uid foo
a   ((1, 2, 3), (10, 9, 8))
b   ((1, 2, 3),)

答案 3 :(得分:0)

如何使用defaultdict,像这样:

L = [['uid1',(x1,y1,t1)],
        ['uid1',(x2,y2,t2)],
        ['uid2',(x3,y3,t3)],
        ['uid3',(x4,y4,t4)],
        ['uid2',(x5,y5,t5)]]


from collections import defaultdict

dd = defaultdict(list)

for i in L:
    dd[i[0]].append(i[1])

输出:打印(dd)

defaultdict(list,
            {'uid1': [(x1, y1, t1), (x2, y2, t2)],
             'uid2': [(x3, y3, t3), (x5, y5, t5)],
             'uid3': [(x4, y4, t4)]})