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

如何在Pandas中匹配两个DataFrame的语言数据并统计有效员工数及总剩余容量

解决你的Python Pandas语言统计问题

我来帮你搞定这个工作分配工具里的统计需求!你的核心目标是基于剩余容量≥1的有效员工,统计每种语言的掌握人数和总剩余容量,咱们一步步拆解问题并给出解决方案:

问题分析

你原来的代码有几个关键问题导致没得到预期结果:

  1. 循环里的条件判断逻辑错误:dfau.loc[...]返回的是DataFrame对象,不是布尔值,所以if ... is True永远不会触发统计逻辑;
  2. 没有筛选有效员工,会把剩余容量不足的员工也纳入统计;
  3. 没有为每个语言单独计算统计值,LCount变量没有重置也没有对应到dfln的具体行。

正确解决方案代码

import pandas as pd

# 读取你的Excel数据(路径保持你原来的即可)
dfau = pd.read_excel(r'C:\Users\Projects\pywp\SampleAu.xlsx', sheet_name='Employees')
dfln = pd.read_excel(r'C:\Users\Projects\pywp\SampleAu.xlsx', sheet_name='Languages')

# 1. 先筛选出剩余容量≥1的有效员工
valid_employees = dfau[dfau['Capacity Left'] >= 1]

# 2. 将每个员工掌握的多语言拆分为单独行(适配你的数据格式:逗号+空格分隔)
valid_languages = valid_employees.assign(
    Languages=valid_employees['Languages'].str.split(', ')
).explode('Languages')

# 3. 按语言分组,统计有效员工数和总剩余容量
language_stats = valid_languages.groupby('Languages').agg(
    Count=('Employees', 'nunique'),  # 统计掌握该语言的不同员工数量
    Capacity=('Capacity Left', 'sum')  # 求和剩余容量
).reset_index()

# 4. 和原语言列表合并,确保所有语言都被包含,缺失值填充为0
dfln = dfln.merge(language_stats, on='Languages', how='left').fillna(0)

# 把统计列转为整数(避免填充后出现浮点数)
dfln[['Count', 'Capacity']] = dfln[['Count', 'Capacity']].astype(int)

# 输出结果
print(dfln)

代码解释

  1. 筛选有效员工:先把dfau中Capacity Left ≥1的行单独提取出来,确保只统计符合要求的员工;
  2. 拆分语言行:用str.split(', ')把每个员工的多语言字符串拆成列表,再用explode把列表展开为单独行,这样每个语言对应一个员工记录,方便后续分组统计;
  3. 分组统计:用groupby按语言分组,nunique('Employees')确保同一个员工掌握多种语言时只被统计一次,sum('Capacity Left')计算该语言对应的总剩余容量;
  4. 合并填充:用merge把统计结果和原语言列表dfln合并,how='left'保证原列表里的所有语言都保留,缺失的统计值用fillna(0)填充为0。

注意事项

  • 如果你的语言分隔符不是, (比如有的是纯逗号无空格),请调整str.split的参数为',',并可以加上str.strip()去除空格,比如:valid_employees['Languages'].str.split(',').apply(lambda x: [lang.strip() for lang in x]);
  • 如果员工有重名情况,建议用员工唯一ID来统计Count,替换'Employees'为对应的ID列名即可。

内容的提问来源于stack exchange,提问作者Umberto Clll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:49:05