编写函数处理欧视大赛获奖歌曲数据:将单行数据转换为歌曲词与对应分数的二维元组列表
解决欧视大赛歌曲数据拆分与元组生成问题
你的核心需求是把每首歌曲名称拆分成单个单词,让每个单词和对应歌曲的分数组成元组,最终生成新的DataFrame。你当前的代码问题在于没有针对传入的row进行操作,而是直接遍历了整个ev['Song']列,同时错误地引用了整个Points列,导致无法关联当前行的分数。
修正后的解决方案
我们可以通过以下步骤实现需求:
1. 编写正确的行处理函数
这个函数会接收单行数据,拆分歌曲名并生成对应的元组列表:
import pandas as pd def tuple_generator(row): # 拆分歌曲名为单词(可根据需求调整拆分逻辑,比如处理标点、大小写) # 这里用split()默认按空格拆分,若需要提取纯单词可改用正则:re.findall(r'\w+', row['Song']) words = row['Song'].strip().split() # 获取当前行的分数 current_points = row['Points'] # 生成每个单词与分数的元组 return [(word, current_points) for word in words]
2. 应用函数到整个数据集并生成新DataFrame
通过apply按行处理原DataFrame,再把所有元组列表展开成一个大列表,最后转换为新的DataFrame:
# 假设原数据集是名为ev的DataFrame,包含'Song'和'Points'列 # 按行应用函数,得到每个行对应的元组列表Series row_tuples = ev.apply(tuple_generator, axis=1) # 展开嵌套的列表,得到所有元组的扁平化列表 all_tuples = [tuple_item for sublist in row_tuples for tuple_item in sublist] # 生成新的DataFrame,指定列名 new_df = pd.DataFrame(all_tuples, columns=['Word', 'Points'])
验证示例
比如你的输入行是:
| Song | Points |
|---|---|
| Net als toen | 31 |
调用tuple_generator(ev.iloc[0])会返回:[('Net', 31), ('als', 31), ('toen', 31)],完全符合你的期望。
可选优化
如果歌曲名包含标点(比如逗号、感叹号),可以用正则表达式提取纯单词,避免把标点包含进去:
import re def tuple_generator(row): # 提取所有字母数字组成的单词 words = re.findall(r'\w+', row['Song']) current_points = row['Points'] return [(word, current_points) for word in words]
内容的提问来源于stack exchange,提问作者help me
相关产品推荐
相关产品推荐

