合并多个列表中包含的数据

时间:2019-10-14 09:17:04

标签: python

我正在python 3.6中进行个人项目。我使用熊猫从数据框中的excel文件导入数据,然后将数据提取到几个列表中。

现在,我将举一个例子来确切说明我要实现的目标。 因此,我假设有3个输入列表a,b和c(我确实在列表中插入了索引和一些额外的空格,因此更容易理解):

   0  1      2     3        4      5    6  

a=[1, 5,     6, [10,12,13], 1,   [5,3] ,7]

b=[3, [1,2], 3,  [5,6],   [1,3], [5,6], 9]

c=[1, 0 ,    4,  [1,2],     2  ,  8   , 9]

当列表之一中包含多个元素的列表时,我试图组合数据以获取所有组合。所以输出需要像这样:

   0  1  2  3   4  5  6   7   8   9   10 11    12  13  14  15  16 17 18 19 20 21 22

a=[1, 5, 5, 6, 10,10,10, 10, 12, 12, 12, 12,   13, 13, 13, 13, 1, 1, 5, 5, 3, 3, 7]

b=[3, 1, 2, 3,  5, 5, 6,  6, 5,  5,  6,  6,    5,   5,  6,  6, 1, 3, 5, 6, 5, 6, 9]

c=[1, 0, 0, 4,  1, 2, 1,  2, 1,  2,  1,  2,    1,   2,  1,  2, 2, 2, 8, 8, 8, 8, 9]

要使其更加清楚:

从原始列表来看,如果我们看一下索引1元素: a [1] = 5,b [1] = [1,2],c [1] = 0。它们在1和2索引位置上转换为以下值:a [1:3] = [5,5]; b [1:3] = [1,2]; c [1:3] = [0,0]

这还需要应用于原始输入列表中的索引3、4和5,以获得与上述示例输出类似的内容。

我希望能够将其推广到更多列表(a,b,c ..... n)。我已经能够针对两个列表执行此操作,但是以一种完全不雅致,绝对不是pythonic的方式进行。另外,我认为我编写的代码无法推广到更多列表。

我正在寻找帮助,至少是一些阅读材料的指南,这些材料可以帮助我实现上面介绍的内容。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作。 查看每一列,计算出组合,然后输出列表:

import pandas as pd
import numpy

a=[1, 5,     6, [10,12,13], 1,   [5,3] ,7]
b=[3, [1,2], 3,  [5,6],   [1,3], [5,6], 9]
c=[1, 0 ,    4,  [1,2],     2  ,  8   , 9]

df = pd.DataFrame([a,b,c])

final_df = pd.DataFrame()
i=0
for col in df.columns:
    temp_df = pd.DataFrame(df[col])
    get_combo = []
    for idx, row in temp_df.iterrows():
        get_combo.append([row[i]])

    combo_list = [list(x) for x in numpy.array(numpy.meshgrid(*get_combo)).T.reshape(-1,len(get_combo))]
    temp_df_alpha = pd.DataFrame(combo_list).T
    i+=1   
    if len(final_df) == 0:
        final_df = temp_df_alpha
    else:
       final_df = pd.concat([final_df, temp_df_alpha], axis=1, sort=False) 


for idx, row in final_df.iterrows():
    print (row.tolist())

输出:

[1, 5, 5, 6, 10, 10, 12, 12, 13, 13, 10, 10, 12, 12, 13, 13, 1, 1, 5, 5, 3, 3, 7]
[3, 1, 2, 3, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 1, 3, 5, 6, 5, 6, 9]
[1, 0, 0, 4, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 9]