pandas DataFrame的元组列表,其中列表示元素,列表示元组长度

jdgnovmf  于 2023-02-28  发布在  其他
关注(0)|答案(3)|浏览(153)

我有一个长度不同的元组列表,其中的元组可以被认为是对人员团队进行编码,例如:

data = [('Alice',),
        ('Bob', 'Betty'),
        ('Charlie', 'Cindy', 'Cramer')]

在此基础上,我想创建一个DataFrame,其中一列是团队成员姓名,另一列是他们所在团队的规模:

name     teamsize
0  Alice    1
1  Bob      2
2  Betty    2
3  Charlie  3
4  Cindy    3
5  Cramer   3

我已经尝试过一些双for循环,但是我不能让事情不工作,并且有这样的印象,这不是一个很好的方法去做它。任何提示将是感激的。

ws51t4hk

ws51t4hk1#

使用列表解析和DataFrame构造函数:

out = pd.DataFrame([[name, len(l)] for l in data for name in l],
                   columns=['name', 'teamsize'])

输出:

name  teamsize
0    Alice         1
1      Bob         2
2    Betty         2
3  Charlie         3
4    Cindy         3
5   Cramer         3

为了好玩,这里有一个纯粹的Pandas解决方案(但可能效率较低!):

out = (pd.DataFrame({'name': data})
         .assign(teamsize=lambda d: d['name'].str.len())
         .explode('name', ignore_index=True)
      )
z9smfwbn

z9smfwbn2#

您可以用途:

name = []
teamsize = []
for i in data:
    for  n in i:
        name.append(n)
        teamsize.append(len(i))

df = pd.DataFrame(list(zip(name, teamsize)),
                  columns =['name', 'teamsize'])
fcg9iug3

fcg9iug33#

另一个Pandas解决方案:

df = (pd.DataFrame(data).T.melt(value_name='name').dropna()
        .assign(teamsize=lambda x: x.groupby(x.pop('variable')).transform('count'))
print(df)

# Output
      name  teamsize
0    Alice         1
3      Bob         2
4    Betty         2
6  Charlie         3
7    Cindy         3
8   Cramer         3

相关问题