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