You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:04:05