如何将可变数量的“夫妇”列表转换为两列数据帧?

2024-09-29 03:41:36 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从具有两列(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'),而是a b


Tags: of数据in列表forauth2printappend
2条回答

很难说你是否有这些价值观,或是对战斗进行了硬编码。但是如果您使用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'])

应该使用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

这样做的效果是使用传递的iterable元素扩展原始列表,而不是将传递的iterable作为原始列表的单个新元素追加

还请注意,我在上面的最后一行中添加了一个逗号(以解决您的边问题中的问题)。这是告诉Python您想传递给extend一个元组(外部元组只包含一个元组)。如果没有这个额外的逗号,外括号将被忽略,Python认为您只传递元组('a', 'b')

这将给出长度为2的10个元组的列表,而不是使用append生成的嵌套结构。从这里,创建数据帧很容易:

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

相关问题 更多 >