妹子发给我一个她们公司 100 多人的 Excel 表格,是关于员工等级评定的,有 N1,N2,N3,N4(百分制得分 /按权重 10%,20%,50%,20%计算)四项得分和总分 sum
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())
https://docs.qq.com/sheet/DR1J1Q1ltSGJ3ZWF1?c=F2A0A0
我也会把各位说的方法都尝试一遍,毕竟妹子们经常用表格,嘿嘿,你们懂的
![]() | 1 pzhzp 2019-12-25 18:23:55 +08:00 via iPhone excel 貌似 sum()-countif()*2 算一个最终总分再分级就可以实现? |
![]() | 3 singerll 2019-12-25 18:28:10 +08:00 via Android sum-n1/60 取整-n2/60 取整-。。。。 |
![]() | 4 turan12 2019-12-25 18:28:53 +08:00 via iPhone 设置一个过渡字段 |
![]() | 6 happydezhangning 2019-12-25 18:50:26 +08:00 工具人? |
![]() | 7 syahd 2019-12-25 19:02:34 +08:00 via iPhone ![]() 楼主应该把脱敏后的表格发出来方便大神操作,推荐腾讯表格分享 |
![]() | 8 zhy0216 2019-12-25 19:13:32 +08:00 你把 c_f 函数的 i 打印出来看看 |
![]() | 9 kokutou 2019-12-25 19:23:53 +08:00 via Android 中间过渡下。。。 先算 sum 等级,再算低于 60 等级。 查的时候也好查呀。 |
![]() | 10 sunmker 2019-12-25 19:25:28 +08:00 我有一个想法: 首先,定义分数对应等级,A:10,B:9,C:8,D:7 其次,通过 excel 的筛选功能分别筛选出“按照 sum 划分”的 ABCD,专门使用一列(比如 G )填上 ABCD 所对应的分数 10、9、8、7 (这个筛选出来后直接可以利用 excel 批量操作,下同) 然后,在开辟四列(比如 H、I、J、K )分别用函数 =IF(A1<6,1,0) 这个判断公式来标记是否不及格,不及格记录 1,及格 0 接着,就是阅读理解了,「如果在上述四项中有一项低于 60 分,等级顺降一级,两项低于 60 分,降两级」,这个是最多降两级( A ),还是最多 4 级( B ) 如果是情况B,直接L列=G-H-I-J-K,然后你接着用筛选功能。一次筛选L列值为10的,在M列填上A,然后依次批量填完所有的…… 如果是情况A,那你可以用L求和HIJK列,筛选,<2 的在M列=G-L,>= 2 的M列=G-2。然后筛选M列为10填写A……9填写B |
![]() | 11 zmxnv123 2019-12-25 19:30:37 +08:00 想知道妹子去哪领 |
![]() | 12 zeroDev 2019-12-25 19:32:43 +08:00 via Adroid 可以试试 openpyxl 库处理 |
13 wangkun025 2019-12-25 19:33:48 +08:00 继续用 excel,不要考虑 Python |
![]() | 14 JCZ2MkKb5S8ZX9pq 2019-12-25 19:35:10 +08:00 直接 excel 插几个过程列好了,搞完还给她个简化版。 |
15 xlcoder166 2019-12-25 19:38:03 +08:00 是关于员工等级评定的,有 N1,N2,N3,N4(百分制得分 /按权重 10%,20%,50%,20%计算)四项得分和总分 sum (N1 * 0.1) + (N2 * 0.2) + (N3 * 0.5) + (N4 * 0.2) 如果 sum 在 90 分以上,为等级 A,80-90:等级 B,70-80:等级 C,60-70:等级 D a + b + c + d = result (A B C D) 如果在上述四项中有一项低于 60 分,等级顺降一级,两项低于 60 分,降两级 ? 这个标准有歧义啊 1. 上诉四项低于 60 分, 这个 60 分指定那个 N1 还是 N1 * 0.1 , 2. 是最多降 2 级吗? 思路 先算总值的条件 1, 再判断条件 2 的情况 |
![]() | 16 dunn 2019-12-25 19:40:16 +08:00 via iPhone excel 多加几个辅助列 |
![]() | 17 passluo 2019-12-25 19:48:12 +08:00 卧槽这个也太简单了吧…… - sum 计算为一列 > C1 - C1 按区间匹配出 ABCD 等,分别对应成 4321 > C2 - countifs 统计一下每行低于 60 分单元格的数量 > C3 - C2-C3 得出最后的分段 > C4 - 把 C4 结果 1234 再对应回 DBCA > C5 - 把 C1-C4 隐藏…… 电子表格这种系统的设计就是鼓励大家去计算一些中间统计结果,再计算出最终结果,为啥一定要一个函数解决所有问题啊。 |
18 xlcoder166 2019-12-25 19:57:12 +08:00 题外话 我很好奇 在这种条件下能拿 A 的都是啥神仙啊 =.= |
![]() | 19 smartG OP @passluo 多谢!看了大家的评论才发现我把问题复杂化了,我对 Excel 的函数功能了解不多,只知道 Python 可以处理批量数据,低估了 Excel 本身的强大功能 |
![]() | 20 smartG OP @xlcoder166 是每项单独的,百分制,不是最多降两级,有几项不及格就降几级,我看了一下,很少有超过两项不及格的 |
![]() | 21 DEANHZED 2019-12-25 20:05:40 +08:00 via iPhone 妹子国二没过吧? |
![]() | 23 smartG OP @wangkun025 是的,用 Python 反而更复杂了 |
![]() | 28 c6h6benzene 2019-12-25 20:14:08 +08:00 via iPhone 我觉得 Excel 单独就能解决(但没有表格我也不知道在说什么 |
![]() | 29 lithiumii 2019-12-25 20:40:32 +08:00 via Android 等级是不是不够?低于 60 也算 D ?还是算不及格? |
![]() | 31 labubu 2019-12-25 21:16:27 +08:00 Excel 导出 csv 然后 python 操作 csv 简单一点 |
![]() | 32 jedicxl 2019-12-25 21:33:09 +08:00 @xlcoder166 大型国企都这路数啊,我们公司就这么搞 |
![]() | 33 snw 2019-12-25 22:15:00 +08:00 via Android 这不就是多加几列算中间过程的事吗…… |
![]() | 34 yalin 2019-12-25 22:18:37 +08:00 我也是用 pandas 各种弄 |
35 sx90 2019-12-25 22:48:16 +08:00 via Android vba 了解一下 |
![]() | 36 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) |
![]() | 37 AlphaTr 2019-12-25 23:07:36 +08:00 ![]() https://docs.qq.com/sheet/DR1J1Q1ltSGJ3ZWF1?c=F2A0A0 闲着贴一个 excel 出来;当然,可以将所有中间步骤函数合并到一起 |
38 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) 规则好像不全,可以全部补充到分类函数里 |
![]() | 39 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 |
40 x66 2019-12-26 09:07:33 +08:00 我有个朋友 excel 贼溜,想问一下在哪领妹子? |
![]() | 41 smartG OP @Telegram 感谢大佬!我尝试一下用 VBA,越发感觉出来 Excel 的强大了 @xiongdong57 好的,我试一下,感谢! @AlphaTr 按着您的做出来啦,感谢感谢! @lithiumii 是的,逻辑差不多,就是代码写不出来,向大佬学习啦,感谢! |
42 lework1234 2019-12-26 13:17:50 +08:00 office 套件没用好啊。 |
![]() | 43 kn007 2019-12-26 19:56:27 +08:00 过来 mark 一下 |