Как преобразовать список переменных чисел "пар" в два столбца данных? - PullRequest
0 голосов
/ 26 февраля 2019

Как мне сгенерировать фрейм данных из списка соавторов списков, который имеет два столбца (auth1 и auth2) с одной строкой для каждой пары?

coauthors = []
coauthors.append((("f","g"),("f","h"),("g","h"))) # combinations of f,g,h
coauthors.append((("i","j"),("i","k"),("i","l"),("j","k"),("j","l"),("l","k"))) # combinations of i,j,k,l
coauthors.append((("a","b"))) # combinations of a,b
for s in coauthors:
   print(*s)

Дополнительный вопрос: почему последняя строка печатаетсявыше для не ('a', 'b'), а скорее ab?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Трудно сказать, есть ли у вас эти значения или жестко закодированы комбинации.Но это может быть намного проще, если вы используете itertools.Создайте списки списков, где каждый подсписок является группой авторов, из которой вы хотите создать пару, затем используйте цепочку и комбинацию, чтобы получить все ваши пары в DataFrame

import pandas as pd
from itertools import combinations, chain
groups = [['f', 'g', 'h'], ['i', 'j', 'k', 'l'], ['a', 'b']]

pd.DataFrame(chain.from_iterable([combinations(x, 2) for x in groups]),
             columns=['auth1', 'auth2'])

Вывод:

  auth1 auth2
0     f     g
1     f     h
2     g     h
3     i     j
4     i     k
5     i     l
6     j     k
7     j     l
8     k     l
9     a     b

Если вам также необходимо добавить уникальный ID для каждой группы, вы можете объединить несколько меньших DataFrames:

pd.concat([
    pd.DataFrame(data, columns=['auth1', 'auth2']).assign(id=gid) 
        for data,gid in zip([combinations(x, 2) for x in groups], range(len(groups)))
], ignore_index=True)

  auth1 auth2  id
0     f     g   0
1     f     h   0
2     g     h   0
3     i     j   1
4     i     k   1
5     i     l   1
6     j     k   1
7     j     l   1
8     k     l   1
9     a     b   2

В качестве альтернативы вы можетераспаковать вещи в список из 3 списков элементов и один раз вызвать pd.DataFrame:

pd.DataFrame([[*z, gid] for data,gid in zip([combinations(x, 2) for x in groups], range(len(groups))) for z in data],
              columns=['auth1', 'auth2', 'id'])
0 голосов
/ 26 февраля 2019

Вы должны использовать extend вместо append для создания вашего исходного списка:

coauthors = []
coauthors.extend((("f","g"),("f","h"),("g","h"))) # combinations of f,g,h
coauthors.extend((("i","j"),("i","k"),("i","l"),("j","k"),("j","l"),("l","k"))) # combinations of i,j,k,l
coauthors.extend((("a","b"),)) # combinations of a,b

Это дает эффект расширения исходного списка элементами переданной итерации, а не добавления переданнойитерируемый как отдельный новый элемент исходного списка.

Также обратите внимание, что я добавил дополнительную запятую к вашей последней строке выше (чтобы исправить проблему в вашем дополнительном вопросе).Это говорит Python, что вы хотели бы передать extend кортеж кортежей (внешний кортеж содержит только один кортеж).Без этой дополнительной запятой внешние скобки игнорируются, и Python думает, что вы передаете только кортеж ('a', 'b').

. Это дает список из 10 кортежей длины 2, а не вложенную структуру, сгенерированную с помощью * 1012.*.Отсюда легко создать DataFrame:

import pandas as pd
df = pd.DataFrame(coauthors, columns=['auth1', 'auth2'])

Предоставление:

  auth1 auth2
0     f     g
1     f     h
2     g     h
3     i     j
4     i     k
5     i     l
6     j     k
7     j     l
8     l     k
9     a     b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...