Python 计算元组列表中的元素,并增加每个项的权重

Python 计算元组列表中的元素,并增加每个项的权重,python,pandas,list,tuples,Python,Pandas,List,Tuples,我有一个元组的列表: for i, item in enumerate(tags_and_weights): tags = item[0] weight = item[1] 其中打印: 1 (['alternative country', 'alternative pop', 'alternative rock', 'art rock', 'brill building pop', 'country rock', 'dance rock', 'experimental', 'f

我有一个
元组的
列表

for i, item in enumerate(tags_and_weights):
    tags = item[0]
    weight = item[1]
其中打印:

1 (['alternative country', 'alternative pop', 'alternative rock', 'art rock', 'brill building pop', 'country rock', 'dance rock', 'experimental', 'folk', 'folk rock', 'garage rock', 'gbvfi', 'indie rock', 'jangle pop', 'lo-fi', 'melancholia', 'noise pop', 'post-punk', 'power pop', 'protopunk', 'psychedelic rock', 'pub rock', 'rock', 'roots rock', 'slow core'], 3)
2 (['funk', 'soul'], 4)
3 (['folk-pop', 'new americana'], 2)
4 ([], 4)
5 (['alternative pop', 'boston rock', 'lilith', 'melancholia'], 2)
6 (['acoustic pop', 'chamber pop', 'folk-pop', 'indie folk', 'indie pop', 'modern rock', 'neo mellow', 'new americana', 'stomp and holler'], 7)
7 (['slow core'], 3)
8 (['alternative rock', 'art rock', 'britpop', 'dance rock', 'electronic', 'madchester', 'new romantic', 'new wave', 'new wave pop', 'permanent wave', 'post-punk', 'rock', 'synthpop', 'uk post-punk'], 4)
9 (['funk', 'neo soul', 'soul'], 6)
10 (['blues-rock', 'classic rock', 'psychedelic rock', 'rock'], 2)
项[0]
对应于一首歌曲(该歌曲有许多相关的标签)

项[1]
对应于歌曲出现次数的计数

但是,我需要的是标签的总计数,而不是歌曲

我现在可以在列表中隔离展平的标记,如下所示:

def flatten(list):
    for sublist in list:
        for item in sublist:
            yield item

only_tags = [i[0] for i in tags_and_weights]
tags = list(flatten(only_tags))
然后,使用
熊猫
,快速数一数:

import pandas as pd
pd.Series(tags).value_counts()
但是我失去了每个标签重量的记录…标签总数被误报了

考虑到我将使用更大的列表进行这些计算,计算所有标签的最有效方法是什么,跟踪标签重量,然后将每个计数乘以它,得到每个标签的最终计数?您可以尝试:

l = [(['alternative country', 'alternative pop', 'alternative rock', 'art rock', 'brill building pop', 'country rock', 'dance rock', 'experimental', 'folk', 'folk rock', 'garage rock', 'gbvfi', 'indie rock', 'jangle pop', 'lo-fi', 'melancholia', 'noise pop', 'post-punk', 'power pop', 'protopunk', 'psychedelic rock', 'pub rock', 'rock', 'roots rock', 'slow core'], 3)
,(['funk', 'soul'], 4)
,(['folk-pop', 'new americana'], 2)
,([], 4)
,(['alternative pop', 'boston rock', 'lilith', 'melancholia'], 2)
,(['acoustic pop', 'chamber pop', 'folk-pop', 'indie folk', 'indie pop', 'modern rock', 'neo mellow', 'new americana', 'stomp and holler'], 7)
,(['slow core'], 3)
,(['alternative rock', 'art rock', 'britpop', 'dance rock', 'electronic', 'madchester', 'new romantic', 'new wave', 'new wave pop', 'permanent wave', 'post-punk', 'rock', 'synthpop', 'uk post-punk'], 4)
,(['funk', 'neo soul', 'soul'], 6)
,(['blues-rock', 'classic rock', 'psychedelic rock', 'rock'], 2)]

tags, counts = zip(*l)

(pd.concat([pd.Series(counts[i], index=tags[i]) for i in range(len(tags))])
   .sum(level=0)
   .sort_values(ascending=False))
将元组列表解压为两个列表后,将列表理解与
pd.concat
sum
一起使用

输出:

funk                   10
soul                   10
rock                    9
folk-pop                9
new americana           9
acoustic pop            7
indie folk              7
post-punk               7
dance rock              7
art rock                7
alternative rock        7
chamber pop             7
stomp and holler        7
neo mellow              7
modern rock             7
indie pop               7
slow core               6
neo soul                6
alternative pop         5
melancholia             5
psychedelic rock        5
britpop                 4
permanent wave          4
uk post-punk            4
synthpop                4
new wave pop            4
new wave                4
new romantic            4
madchester              4
electronic              4
brill building pop      3
gbvfi                   3
country rock            3
experimental            3
folk                    3
folk rock               3
garage rock             3
alternative country     3
indie rock              3
jangle pop              3
lo-fi                   3
noise pop               3
power pop               3
protopunk               3
pub rock                3
roots rock              3
blues-rock              2
boston rock             2
lilith                  2
classic rock            2
dtype: int64
您可以尝试:

l = [(['alternative country', 'alternative pop', 'alternative rock', 'art rock', 'brill building pop', 'country rock', 'dance rock', 'experimental', 'folk', 'folk rock', 'garage rock', 'gbvfi', 'indie rock', 'jangle pop', 'lo-fi', 'melancholia', 'noise pop', 'post-punk', 'power pop', 'protopunk', 'psychedelic rock', 'pub rock', 'rock', 'roots rock', 'slow core'], 3)
,(['funk', 'soul'], 4)
,(['folk-pop', 'new americana'], 2)
,([], 4)
,(['alternative pop', 'boston rock', 'lilith', 'melancholia'], 2)
,(['acoustic pop', 'chamber pop', 'folk-pop', 'indie folk', 'indie pop', 'modern rock', 'neo mellow', 'new americana', 'stomp and holler'], 7)
,(['slow core'], 3)
,(['alternative rock', 'art rock', 'britpop', 'dance rock', 'electronic', 'madchester', 'new romantic', 'new wave', 'new wave pop', 'permanent wave', 'post-punk', 'rock', 'synthpop', 'uk post-punk'], 4)
,(['funk', 'neo soul', 'soul'], 6)
,(['blues-rock', 'classic rock', 'psychedelic rock', 'rock'], 2)]

tags, counts = zip(*l)

(pd.concat([pd.Series(counts[i], index=tags[i]) for i in range(len(tags))])
   .sum(level=0)
   .sort_values(ascending=False))
将元组列表解压为两个列表后,将列表理解与
pd.concat
sum
一起使用

输出:

funk                   10
soul                   10
rock                    9
folk-pop                9
new americana           9
acoustic pop            7
indie folk              7
post-punk               7
dance rock              7
art rock                7
alternative rock        7
chamber pop             7
stomp and holler        7
neo mellow              7
modern rock             7
indie pop               7
slow core               6
neo soul                6
alternative pop         5
melancholia             5
psychedelic rock        5
britpop                 4
permanent wave          4
uk post-punk            4
synthpop                4
new wave pop            4
new wave                4
new romantic            4
madchester              4
electronic              4
brill building pop      3
gbvfi                   3
country rock            3
experimental            3
folk                    3
folk rock               3
garage rock             3
alternative country     3
indie rock              3
jangle pop              3
lo-fi                   3
noise pop               3
power pop               3
protopunk               3
pub rock                3
roots rock              3
blues-rock              2
boston rock             2
lilith                  2
classic rock            2
dtype: int64

假设您创建了一个数据帧:

d = [(['alternative country', ... # Your data
df = pd.DataFrame(data=d, columns=['tags', 'weight'])
一个可能的解决方案,使用纯熊猫,没有任何列表理解 详情如下:

df.tags.apply(pd.Series).stack().reset_index(level=1, drop=True)\
    .rename('tag').to_frame().join(df.weight).groupby('tag').sum()\
    .sort_values(['weight', 'tag'], ascending=[False, True])
为了便于学习,您可以尝试将连续步骤作为单独的操作 看看结果

也许一个优点是标签在具有相同标签的组内进行排序
权重。

假设您创建了一个数据帧:

d = [(['alternative country', ... # Your data
df = pd.DataFrame(data=d, columns=['tags', 'weight'])
一个可能的解决方案,使用纯熊猫,没有任何列表理解 详情如下:

df.tags.apply(pd.Series).stack().reset_index(level=1, drop=True)\
    .rename('tag').to_frame().join(df.weight).groupby('tag').sum()\
    .sort_values(['weight', 'tag'], ascending=[False, True])
为了便于学习,您可以尝试将连续步骤作为单独的操作 看看结果

也许一个优点是标签在具有相同标签的组内进行排序
重量。

我不知道你在问什么。从输入中显示期望的结果。<代码>集合。计数器< /代码>可能是有用的。也考虑一些类似于<代码> [i(0)] i(1)] />代码>将标签列表乘以计数。请提供原始形式的输入,而OutPuti的一个小例子不知道你在问什么。请从该输入中显示期望的结果。<代码>集合。计数器< /代码>可能是有用的。还考虑一些类似于<代码> [ i [ 0 ] ] i(1)] />代码。将该标记列表乘以COUNT。请提供原始形式的输入,以及创建数据文件并尝试您的解决方案的示例,IM获得<代码>文件。“test.py”,第47行,in.sort_值(['weight',tag'],升序=[False,True])keyrorm:'tag'
创建数据帧并尝试解决方案后,我得到
文件“test.py”,第47行,in.sort_值(['weight',tag',升序=[False,True])keyrorm:'tag