Слияние списков по индексу в Python - PullRequest
5 голосов
/ 29 марта 2019

Сценарий: Я получил 3 списка из файла N-троек, и теперь я пытаюсь объединить их в один организованный список.

Исходный формат:

+--------+---------+--------+
| 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)) 

Но это дало мне только прямое слияние соответствующих предметов.

Вопрос: Я знаю, что можно циклически проходить по спискам и получать соответствующие элементы, а также вручную создавать массив / фрейм данных.Мой вопрос: есть ли какая-либо функция или пакет, которые могут сделать это автоматически и менее запутанным способом?

Obs: У меня уже есть способ создать кадр данных, выполняя цикл вручную.Я просто хотел узнать, есть ли другой, более эффективный способ.

Ответы [ 2 ]

3 голосов
/ 29 марта 2019

Если я вас правильно понимаю, у вас есть список, в котором есть элементы кортежей размером три объекта, и вы хотите поместить их в другой кортеж. Для этого вы можете использовать zip.

result = list(zip(list1, zip(*[(l1,l2,l3) for i in list1])))
1 голос
/ 29 марта 2019

Вы говорите, что вам нужен фрейм данных, поэтому я буду исходить из предположения, что операции pandas приемлемы.

Я также предполагаю, что символы - это только ваше форматирование, а не часть фактического файла данных (в будущем такие декораторы не нужны и даже вредны для вопросов такого типа)

Используя ваши данные, я создаю 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...