妹子发给我一张公司要处理的绩效表格,我以为很简单,然而菜是原罪

2019-12-25 18:00:33 +08:00
 smartG

妹子发给我一个她们公司 100 多人的 Excel 表格,是关于员工等级评定的,有 N1,N2,N3,N4(百分制得分 /按权重 10%,20%,50%,20%计算)四项得分和总分 sum

标准如下:

尝试的方法:

代码部分( python 小白,大佬轻喷)

import pandas as pd  
data1=pd.read_excel("C:/Users/acer/Desktop/绩效.xlsx")  
def final (num1):  
    if (num1==10):  
        return "A"  
    elif(num1==9):  
        return "B"  
    elif(num1==8):  
        return "C"  
    elif(num1==7):  
        return "D"  
    elif (num1==6):  
        return "E"

def c_f1():  
    for i in range(5):  
        def c_f(first_number):  
            num=0  
            if(data1.iloc[i].values[1]<6):  
                num+=1  
            elif(data1.iloc[i].values[2]<12):  
                num+=1  
            elif(data1.iloc[i].values[3]<30):  
                num+=1  
            elif(data1.iloc[i].values[4]<12):  
                num+=1  
            return first_number-num  

        if (data1.iloc[i].values[5]>=90):
                n1=c_f(10)
                return final(n1)
        elif(data1.iloc[i].values[5]>=80 and data1.iloc[1].values[5]<90):
                n1=c_f(9)
                return final(n1)
        elif(data1.iloc[i].values[5]>=70 and data1.iloc[1].values[5]<80):
                n1=c_f(8)
                return final(n1)
        elif(data1.iloc[i].values[5]>=60 and data1.iloc[1].values[5]<70):
                n1=c_f(7)
                return final(n1)
        elif(data1.iloc[i].values[5]>=50 and data1.iloc[1].values[5]<60):
                n1=c_f(6)
                return final(n1)
print(c_f1())
4239 次点击
所在节点    问与答
43 条回复
DEANHZED
2019-12-25 20:05:40 +08:00
妹子国二没过吧?
smartG
2019-12-25 20:05:54 +08:00
@zeroDev 好的,我试一下!
smartG
2019-12-25 20:06:15 +08:00
@wangkun025 是的,用 Python 反而更复杂了
smartG
2019-12-25 20:06:41 +08:00
@zmxnv123 哈哈哈就是人事妹子
smartG
2019-12-25 20:07:03 +08:00
@zhy0216 i 好像有点问题……
smartG
2019-12-25 20:07:53 +08:00
@pzhzp 好的,明天上班试试,多谢啦
smartG
2019-12-25 20:11:44 +08:00
@DEANHZED 妹子用的 if,and 函数,多层嵌套……
c6h6benzene
2019-12-25 20:14:08 +08:00
我觉得 Excel 单独就能解决(但没有表格我也不知道在说什么
lithiumii
2019-12-25 20:40:32 +08:00
等级是不是不够?低于 60 也算 D ?还是算不及格?
smartG
2019-12-25 21:08:55 +08:00
@lithiumii 是啊,没写全,后面还有的
daimiaopeng
2019-12-25 21:16:27 +08:00
Excel 导出 csv 然后 python 操作 csv 简单一点
jedicxl
2019-12-25 21:33:09 +08:00
@xlcoder166 大型国企都这路数啊,我们公司就这么搞
snw
2019-12-25 22:15:00 +08:00
这不就是多加几列算中间过程的事吗……
yalin
2019-12-25 22:18:37 +08:00
我也是用 pandas 各种弄
sx90
2019-12-25 22:48:16 +08:00
vba 了解一下
lithiumii
2019-12-25 22:49:56 +08:00
贴代码没有缩进,那干脆就一行一行来了,还能展示计算过程,其实 py 跟 excel 差不多,多加几步路就是了。

import pandas as pd

# 假定这个 excel 读进来就四列,n1, n2, n3, n4,每一行一个人
df = pd.read_excel("C:/Users/acer/Desktop/绩效.xlsx")

# 先数每个人挂了几科
df["n_failed"] = df.apply(lambda x: sum(x < 60), axis=1)

# 加权求和,反正权重是死的硬编码就是了
df["sum"] = df["n1"] * 0.1 + df["n2"] * 0.2 + df["n3"] * 0.5 + df["n4"] * 0.2

# 从 sum 得到用数字表示的等级( 5: A, 4: B, 3: C, 2: D, 小于 2 的不及格 F )
df["raw_grade_int"] = df["sum"].apply(lambda x:int(x / 10) - 4)

# 挂几科降几级
df['final_grade_int'] = df["raw_grade_int"] - df['n_failed']

# 从数字表示的等级转为 ABCDF,用个硬编码的字典对应
df['final_grade']=df['final_grade_int'].apply(lambda x: {5: "A", 4: "B", 3: "C", 2: "D"}.get(x, 'F'))

# 跳过不需要的列用于输出
output_df = df[['n1', 'n2', 'n3', 'n4','final_grade']]

# 输出,不需要 index
output_df.to_excel("C:/Users/acer/Desktop/工具人.xlsx", index = False)
AlphaTr
2019-12-25 23:07:36 +08:00
https://docs.qq.com/sheet/DR1J1Q1ltSGJ3ZWF1?c=F2A0A0 闲着贴一个 excel 出来;当然,可以将所有中间步骤函数合并到一起
xiongdong57
2019-12-25 23:08:14 +08:00
def category(x):
# column contains N1,N2,N3,N4,sum
level = min(100 - x.loc['sum'], 30) // 10

x = x[["N1", "N2", "N3", "N4"]]
count = (x < 60).sum()
category = level + min(count, 2)

if category < 1:
return "A"
elif category < 2:
return "B"
elif category < 3:
return "C"
else:
return "D"

df['category'] = df.apply(category, axis=1)

规则好像不全,可以全部补充到分类函数里
Telegram
2019-12-25 23:09:29 +08:00
处理 EXCEL 当然是用自带的 VBA 最强大啊。
https://i.loli.net/2019/12/25/524AsHLaoNiWTkY.png


代码如下:

Function JSS(rng As Range)
Select Case rng(1) * 0.1 + rng(2) * 0.2 + rng(3) * 0.5 + rng(4) * 0.2

Case 90 To 100
sum1 = 65 'A ascii 码
Case 80 To 89
sum1 = 66 'B
Case 70 To 79
sum1 = 67 'C
Case Is < 70
sum1 = 68 'D
End Select

For i = 1 To 4
If rng(i) < 60 Then sum2 = sum2 + 1 '统计小于 60 的个数
If sum2 = 2 Then Exit For '两个项目小于 60,就别继续看了
Next i

JSS = Chr(sum1 + sum2)
End Function


具体使用方法:alt+F11,然后右键,插入,模块
https://i.loli.net/2019/12/25/McivXKrDubyU59Y.png

代码粘贴进去,然后就可以在表格里用这个函数了(函数一定要写在模块里)
https://i.loli.net/2019/12/25/HLFiZkTRJlWVfw8.png
x66
2019-12-26 09:07:33 +08:00
我有个朋友 excel 贼溜,想问一下在哪领妹子?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632268

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX