在Python中按索引合并列表

时间:2019-03-29 16:37:05

标签: python list

场景::我从N个三元组文件中检索了3个列表,现在我试图将它们组合成一个单一的,有组织的列表。

原始格式:

+--------+---------+--------+
| 100021 | hasdata | y      |
+--------+---------+--------+
| 100021 | name    | USER1  |
+--------+---------+--------+
| 100021 | extra1  | typer  |
+--------+---------+--------+
| 100021 | extra2  | reader |
+--------+---------+--------+
| 50003  | hasdata | y      |
+--------+---------+--------+
| 50003  | name    | USER2  |
+--------+---------+--------+
| 50003  | extra1  | reader |
+--------+---------+--------+
| 50003  | extra2  | writer |
+--------+---------+--------+
| 50003  | extra3  | coder  |
+--------+---------+--------+
| 30007  | hasdata | n      |
+--------+---------+--------+
| 30007  | name    | 0001   |
+--------+---------+--------+
| 30007  | extra1  | Null   |
+--------+---------+--------+

在循环ntriples文件时,我产生了3个列表(每个列表都是上表的一列)。我现在正在尝试将它们匹配成这样:

+--------+---------+-------+--------+--------+--------+
|        | hasdata | name  | extra1 | extra2 | extra3 |
+--------+---------+-------+--------+--------+--------+
| 100021 | y       | USER1 | typer  | reader |        |
+--------+---------+-------+--------+--------+--------+
| 50003  | y       | USER2 | reader | writer | coder  |
+--------+---------+-------+--------+--------+--------+
| 30007  | extra2  | n     | 0001   | Null   |        |
+--------+---------+-------+--------+--------+--------+

到目前为止,我已经使用了该功能:

def listOfTuples(l1, l2, l3): 
    return list(map(lambda x, y, z:(x,y, z), l1, l2, l3)) 

但这仅使我直接合并了对应项。

问题::我知道可以遍历列表并获取匹配项并手动构建数组/数据框。我的问题是,是否有任何函数或程序包可以自动且以较少混淆的方式执行此操作?

肥胖:我已经可以通过手动循环来生成数据框。我只是想知道是否还有另一种更有效的方法。

2 个答案:

答案 0 :(得分:3)

如果我对您的理解正确,那么您将获得一个列表,其中包含具有三个对象大小的元组元素,并且您希望将它们放入另一个元组中。可以使用zip来实现。

result = list(zip(list1, zip(*[(l1,l2,l3) for i in list1])))

答案 1 :(得分:1)

您说您想要一个数据框,因此我将假设熊猫操作是可以接受的。

我还假设这些符号仅是您设置的格式,而不是实际数据文件的一部分(将来,此类修饰符是不必要的,甚至对此类问题均有害)

使用给定的数据,我创建一个df(pd.read_csv或类似的数字)然后对其进行旋转

    col1    col2    col3
0   100021  hasdata y
1   100021  name    USER1
2   100021  extra1  typer
3   100021  extra2  reader
4   50003   hasdata y
5   50003   name    USER2
6   50003   extra1  reader
7   50003   extra2  writer
8   50003   extra3  coder
9   30007   hasdata n
10  30007   name    0001
11  30007   extra1  Null

df.pivot(index='col1',columns='col2',values='col3')

col2    extra1  extra2  extra3  hasdata name
col1                    
30007   Null    NaN     NaN     n       0001
50003   reader  writer  coder   y       USER2
100021  typer   reader  NaN     y       USER1