Python DataFrame拆分多值Language列后筛选单语言Top X名称的实现方法
解决单个语言Top X Name的筛选问题
嘿,我来帮你搞定这个需求!你之前用explode处理多值Language列的思路完全可以复用,咱们一步步来实现你要的功能~
第一步:先处理数据基础准备
首先咱们得把示例数据转成DataFrame,还要修正Score列的类型——原始数据里它是字符串,直接排序会出错,得转成数值类型:
import pandas as pd # 你的示例数据 data = [{'Name': 'Andes, The', 'Year': 2021, 'Score': '8', '2nd Score': 8.8, '% of People': '87%', 'Country': 'The Netherlands', 'Fruit': 'The Apple', 'Export Countries': 'United States,United Kingdom', 'Language': 'English,Japanese,French', 'Transit Duration': 148.0, 'Quality': 1.0, 'Taste': 0.0, 'Freshness': 0.0, 'Packaging': 0.0}, {'Name': 'Phil', 'Year': 2021, 'Score': '8.5', '2nd Score': 8.8, '% of People': '87%', 'Country': 'Spain', 'Fruit': 'The Banana', 'Export Countries': 'United Kingdom, Germany', 'Language': 'English,German,French,Italian', 'Transit Duration': 118.0, 'Quality': 1.0, 'Taste': 0.0, 'Freshness': 0.0, 'Packaging': 0.0}, {'Name': 'Sarah', 'Year': 2021, 'Score': '9', '2nd Score': 8.8, '% of People': '89%', 'Country': 'Greece', 'Fruit': 'The Plum', 'Export Countries': 'Germany,United States', 'Language': 'English,German,French,Italian', 'Transit Duration': 165.0, 'Quality': 1.0, 'Taste': 0.0, 'Freshness': 0.0, 'Packaging': 0.0}, {'Name': 'William', 'Year': 2021, 'Score': '6', '2nd Score': 8.8, '% of People': '65%', 'Country': 'Brazil', 'Fruit': 'Strawberries', 'Export Countries': 'Spain,Greece', 'Language': 'English,Spanish,French', 'Transit Duration': 153.0, 'Quality': 1.0, 'Taste': 0.0, 'Freshness': 0.0, 'Packaging': 0.0}] df = pd.DataFrame(data) # 把Score从字符串转成浮点数,确保排序正确 df['Score'] = df['Score'].astype(float)
第二步:拆分并展开多值Language列
这步和你之前处理均值的逻辑完全一致,把每个多值的Language拆成单独的行:
# 拆分Language列并展开成单行单语言 exploded_df = df.assign(Language=lambda x: x['Language'].str.split(',')).explode('Language')
第三步:逐个处理单个语言的Top X筛选
现在就可以针对指定语言,按Score降序排序后取Top X了。比如你要的English语言Top4:
# 定义目标语言和Top数量 target_language = 'English' top_x = 4 # 筛选、排序、取Top X,最后整理成你要的格式 top_result = (exploded_df[exploded_df['Language'] == target_language] .sort_values(by='Score', ascending=False) # 按Score从高到低排序 .head(top_x) # 取前X个 .rename(columns={'Name': 'Top X'}) # 把Name列重命名为Top X [['Language', 'Top X']]) # 只保留需要的两列 print(top_result)
运行后输出的结果(注意:Sarah的Score是9,是最高的,所以会排在第一位):
Language Top X 2 English Sarah 1 English Phil 0 English Andes, The 3 English William
扩展:批量逐个处理多个语言
如果需要批量处理多个语言,可以用循环来逐个输出结果:
# 要处理的语言列表 languages = ['English', 'French', 'German'] top_x = 2 for lang in languages: result = (exploded_df[exploded_df['Language'] == lang] .sort_values(by='Score', ascending=False) .head(top_x) .rename(columns={'Name': 'Top X'}) [['Language', 'Top X']]) print(f"\n=== Top {top_x} for {lang} ===") print(result)
核心逻辑说明
explode的作用:把每个Name关联的多个Language拆成单独行,这样每个Name和对应的Language一一对应,方便后续按Language筛选。- 排序的关键:必须先把
Score转成数值类型,否则字符串排序会出现'8.5' > '9'的错误结果。 head(x)的用法:在排序后取前X行,就是该语言下Score最高的X个Name。
内容的提问来源于stack exchange,提问作者Aemonar
相关产品推荐
相关产品推荐

