引言
LeetCode新出了Pandas题库,本人感兴趣就拿了一下它的那个勋章,收获还是有的。但最近需要用到Pandas了,把当时刷题时学的内容又忘了,故写下本篇博客,整理Pandas的各种技巧。
查询/选择
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
从Employee表中选择第二高的薪水:
使用df.drop_duplicates筛选不重复的所有薪资
df.drop_duplicates(subset=None, keep=‘first’, inplace=False, ignore_index=False)
- subset: 设置根据列的子集来判断重复值,默认根据DataFrame的所有列来判断重复值,即所有列的数据都相同时,才算重复值。如果指定了子集,则只要子集的这些列的数据都相同,就算重复值。
- keep: 设置保留重复值中的哪一个,可以设置的值有{‘first’, ‘last’, False},默认first,如果有重复值,则保留第一个。设置为last,则保留重复值中的最后一个。设置为False,则删除所有的重复值,一个也不保留。
- inplace: 设置是否在DataFrame本身删除数据,默认为False,在DataFrame的副本里删除数据,返回删除数据后的DataFrame。如果设置为True,则在调用drop()的DataFrame本身执行删除,返回值为None。
- ignore_index: 设置是否忽略行索引,默认False,去重后的结果的行索引保持原索引不变。如果设置为True,则结果的行索引被重置为0开始的自然数。
使用df.sort_values 对薪资进行排序
df.sort_values()
# 只列举关键代码
df = employee.drop_duplicates(subset=['salary']).sort_values('salary',ascending=False)
# 用loc选的是行标签,iloc是行下标,排序后100的行标签并不会变,原来第几就是几
return df.iloc[[1]][['salary']].rename(columns={'salary':f'SecondHighestSalary'})
使用drop删除数据:
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’):
- labels: 指定要删除的行索引或列名,参数传入方式为字符串或list-like。如果指定的是列名,要配合将axis参数设置为1或columns。
- axis: 设置删除行还是删除列,0或index表示删除行,1或columns表示删除列,默认值为0。
- index: 设置要删除的行,相当于设置labels且axis为0或index。
- columns: 设置要删除的列,相当于设置labels且axis为1或columns。
- level: 如果索引是多重索引,指定按多重索引中的哪个等级的索引删除,可以传入多重索引的下标或名称。
- inplace: 设置是否在DataFrame本身删除数据,默认为False,在DataFrame的副本里删除数据,返回删除数据后的DataFrame。如果设置为True,则在调用drop()的DataFrame本身执行删除,返回值为None。
- errors: 设置是否抛出错误,可以设置的值有{‘ignore’, ‘raise’},默认raise,表示抛出错误。ignore表示忽略错误,跳过传入的错误索引名或列名,正确的索引名或列名不受影响,正常执行删除。
排序
问题:输入一个成绩,排序后并输出它的排名
输入:
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
输出:
+-------+------+
| score | rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
主要核心函数:
scores['rank'] = scores['score'].rank(method='dense',ascending=False)
return scores[['score','rank']].sort_values('score',ascending=False)
DataFrame.rank(axis=0, method=‘average’, numeric_only=False, na_option=‘keep’, ascending=True, pct=False)
参数
- axis{0 or ‘index’, 1 or ‘columns’}, default 0。选择坐标轴,按行排序的 axis=0或’index’,反之
- method{‘average’, ‘min’, ‘max’, ‘first’, ‘dense’}, default ‘average’ 排序方法
-
- average:并列名次选平均的,并列第二,算并列2.5名
-
- min:并列名次选最小的,并列第一,就算并列第一
-
- max:存在并列排名,并列的次序选择大的那个,比如两个人并列第一,算并列第二
-
- first:按照出现次序排序(不存在并列排名),最后一个名次等于人数
-
- dense:相同的得分排序一致(存在并列排名),但最后一个名次可能小于人数
- numeric_only bool, default False 是否仅仅计算数字型的columns,布尔值
- na_option{‘keep’, ‘top’, ‘bottom’}, default ‘keep’ NaN值是否参与排名及如何排名
-
- keep:将NaN等级分配给NaN值
-
- top: 将NaN排名至顶部
-
- bottom:将NaN排名至底部
- ascending bool, default True 是否为升序
- pc tbool, default False 是否以百分比形式显示返回的排名。