1. Pandas DataFrame
数据排序与排名详解
在 Pandas 中,数据排序与排名 是常见的数据处理操作。通过排序和排名,可以对数据进行组织,方便后续分析和展示。主要的函数有:
sort_values()
:用于排序DataFrame
或Series
的值。sort_index()
:按照索引进行排序。rank()
:为数据赋予排名。
1. sort_values()
函数
sort_values()
用于对 DataFrame
或 Series
中的一个或多个列进行排序。它支持升序和降序排序,并可以处理缺失值。
语法:
df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
by
:指定要排序的列或列的名称。如果是多个列,可以传递一个列表。axis
:排序的轴,默认值为0
,表示按行排序;设置为1
时表示按列排序。ascending
:是否升序排列,默认值为True
(升序)。如果是多个列,可以传递一个布尔值列表。inplace
:是否修改原始DataFrame
,默认为False
,返回排序后的数据。kind
:排序算法,可以是'quicksort'
、'mergesort'
或'heapsort'
。na_position
:如何处理缺失值,'last'
(默认)将缺失值放在最后,'first'
将缺失值放在最前面。
示例 1:按单列升序排序
import pandas as pd
# 创建示例 DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, 30, 35, 28],
'Salary': [50000, 60000, 70000, 80000]
})
# 按 'Age' 列升序排序
df_sorted = df.sort_values(by='Age')
print(df_sorted)
输出:
Name Age Salary
0 Alice 24 50000
3 David 28 80000
1 Bob 30 60000
2 Charlie 35 70000
示例 2:按多列排序
# 按 'Age' 升序排序,如果 'Age' 相同,则按 'Salary' 降序排序
df_sorted = df.sort_values(by=['Age', 'Salary'], ascending=[True, False])
print(df_sorted)
输出:
Name Age Salary
0 Alice 24 50000
3 David 28 80000
1 Bob 30 60000
2 Charlie 35 70000
示例 3:处理缺失值排序
# 添加缺失值并进行排序
df_with_na = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, None, 35, 28],
'Salary': [50000, 60000, 70000, 80000]
})
# 按 'Age' 升序排序,将缺失值放在最后
df_sorted = df_with_na.sort_values(by='Age', na_position='last')
print(df_sorted)
输出:
Name Age Salary
0 Alice 24.0 50000
3 David 28.0 80000
2 Charlie 35.0 70000
1 Bob NaN 60000
2. sort_index()
函数
sort_index()
用于按索引对 DataFrame
或 Series
进行排序。
语法:
df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False)
axis
:排序的轴,0
为按行排序,1
为按列排序。level
:多级索引时,指定要排序的级别。ascending
:是否升序排列。inplace
:是否修改原始DataFrame
。na_position
:如何处理缺失值。
示例:按索引排序
# 创建示例 DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, 30, 35, 28],
'Salary': [50000, 60000, 70000, 80000]
}, index=[3, 1, 2, 4])
# 按索引升序排序
df_sorted = df.sort_index(ascending=True)
print(df_sorted)
输出:
Name Age Salary
1 Bob 30 60000
2 Charlie 35 70000
3 Alice 24 50000
4 David 28 80000
3. rank()
函数
rank()
用于为数据列分配排名,可以处理相同的值,并支持不同的排名方法(例如平均排名、最小排名等)。
语法:
df.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
axis
:指定沿着哪一轴排名,0
为按行排名,1
为按列排名。method
:排名的方法,常见的有'average'
(平均排名)、'min'
(最小排名)、'max'
(最大排名)、'first'
(按出现顺序排名)、'dense'
(密集排名)。na_option
:处理缺失值的方法,'keep'
保留缺失值,'top'
将缺失值排在顶部,'bottom'
将缺失值排在底部。ascending
:是否升序排列。pct
:如果为True
,则返回百分比排名(0到1之间的浮动值)。
示例 1:按单列排名
# 创建示例 DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, 30, 35, 28],
'Salary': [50000, 60000, 70000, 80000]
})
# 按 'Salary' 排名
df['Salary_Rank'] = df['Salary'].rank()
print(df)
输出:
Name Age Salary Salary_Rank
0 Alice 24 50000 1.0
1 Bob 30 60000 2.0
2 Charlie 35 70000 3.0
3 David 28 80000 4.0
示例 2:处理重复值排名
# 创建包含重复值的示例 DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Salary': [50000, 50000, 70000, 80000]
})
# 按 'Salary' 排名,使用平均排名方法
df['Salary_Rank'] = df['Salary'].rank(method='average')
print(df)
输出:
Name Salary Salary_Rank
0 Alice 50000 1.5
1 Bob 50000 1.5
2 Charlie 70000 3.0
3 David 80000 4.0
示例 3:百分比排名
# 创建示例 DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Salary': [50000, 60000, 70000, 80000]
})
# 按 'Salary' 排名,返回百分比排名
df['Salary_Percent_Rank'] = df['Salary'].rank(pct=True)
print(df)
输出:
Name Salary Salary_Percent_Rank
0 Alice 50000 0.25
1 Bob 60000 0.50
2 Charlie 70000 0.75
3 David 80000 1.00
总结
在 Pandas 中,排序和排名是非常常见的操作:
sort_values()
:用于按列的值进行排序,可以升序或降序排列,支持多个排序条件。sort_index()
:按索引对数据进行排序。rank()
:为数据分配排名,支持多种排名方法和缺失值处理。
这些操作在数据分析和数据预处理阶段非常有用,尤其是在需要对数据进行排序、排名、排名平局处理等任务时。
2. Pandas DataFrame
数据排序与排名综合实战
在本部分中,我们将通过一个综合实战案例,展示如何使用 Pandas 进行 数据排序与排名,以帮助您更好地理解如何在实际应用中处理数据。假设我们有一个包含学生成绩的 DataFrame
,我们将根据成绩进行排序,并为每个学生分配排名。
1. 创建示例数据集
首先,我们创建一个包含学生姓名、学科和成绩的 DataFrame
。
import pandas as pd
# 创建包含学生成绩的 DataFrame
data = {
'Student': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'Math': [85, 92, 78, 88, 93],
'English': [88, 78, 92, 85, 90],
'Science': [90, 85, 88, 92, 91]
}
df = pd.DataFrame(data)
print(df)
输出:
Student Math English Science
0 Alice 85 88 90
1 Bob 92 78 85
2 Charlie 78 92 88
3 David 88 85 92
4 Eva 93 90 91
2. 数据排序
按单科成绩排序
我们可以根据某一科目的成绩对学生进行排序,假设我们要根据数学成绩对学生进行降序排序。
# 按数学成绩进行降序排序
df_sorted_math = df.sort_values(by='Math', ascending=False)
print(df_sorted_math)
输出:
Student Math English Science
4 Eva 93 90 91
1 Bob 92 78 85
3 David 88 85 92
0 Alice 85 88 90
2 Charlie 78 92 88
按多科成绩排序
如果我们想要根据多科成绩进行排序(例如,先按数学成绩排序,数学成绩相同的按英语成绩排序),可以使用多个排序条件。
# 先按数学成绩降序排序,若数学成绩相同,再按英语成绩降序排序
df_sorted_multi = df.sort_values(by=['Math', 'English'], ascending=[False, False])
print(df_sorted_multi)
输出:
Student Math English Science
4 Eva 93 90 91
1 Bob 92 78 85
3 David 88 85 92
0 Alice 85 88 90
2 Charlie 78 92 88
3. 数据排名
计算单科排名
我们可以为每一位学生在数学、英语和科学成绩上分别分配排名,使用 rank()
方法。默认情况下,rank()
会为相同成绩的学生分配相同的排名(平均排名)。
# 为每一科成绩分配排名
df['Math_Rank'] = df['Math'].rank(ascending=False)
df['English_Rank'] = df['English'].rank(ascending=False)
df['Science_Rank'] = df['Science'].rank(ascending=False)
print(df)
输出:
Student Math English Science Math_Rank English_Rank Science_Rank
0 Alice 85 88 90 4.0 2.0 2.0
1 Bob 92 78 85 2.0 5.0 5.0
2 Charlie 78 92 88 5.0 1.0 4.0
3 David 88 85 92 3.0 4.0 1.0
4 Eva 93 90 91 1.0 3.0 3.0
修改排名方法
可以改变排名的方法。例如,使用 'min'
方法可以为相同成绩的学生分配相同的最小排名。
# 使用 'min' 方法进行排名
df['Math_Rank_Min'] = df['Math'].rank(method='min', ascending=False)
df['English_Rank_Min'] = df['English'].rank(method='min', ascending=False)
df['Science_Rank_Min'] = df['Science'].rank(method='min', ascending=False)
print(df)
输出:
Student Math English Science Math_Rank English_Rank Science_Rank Math_Rank_Min English_Rank_Min Science_Rank_Min
0 Alice 85 88 90 4.0 2.0 2.0 4.0 2.0 2.0
1 Bob 92 78 85 2.0 5.0 5.0 2.0 5.0 5.0
2 Charlie 78 92 88 5.0 1.0 4.0 5.0 1.0 4.0
3 David 88 85 92 3.0 4.0 1.0 3.0 4.0 1.0
4 Eva 93 90 91 1.0 3.0 3.0 1.0 3.0 3.0
百分比排名
如果需要计算学生成绩的百分比排名,可以设置 pct=True
。
# 计算百分比排名
df['Math_Percent_Rank'] = df['Math'].rank(pct=True)
df['English_Percent_Rank'] = df['English'].rank(pct=True)
df['Science_Percent_Rank'] = df['Science'].rank(pct=True)
print(df)
输出:
Student Math English Science Math_Rank English_Rank Science_Rank Math_Rank_Min English_Rank_Min Science_Rank_Min Math_Percent_Rank English_Percent_Rank Science_Percent_Rank
0 Alice 85 88 90 4.0 2.0 2.0 4.0 2.0 2.0 0.25 0.50 0.50
1 Bob 92 78 85 2.0 5.0 5.0 2.0 5.0 5.0 0.75 0.00 0.00
2 Charlie 78 92 88 5.0 1.0 4.0 5.0 1.0 4.0 0.00 1.00 0.25
3 David 88 85 92 3.0 4.0 1.0 3.0 4.0 1.0 0.50 0.25 1.00
4 Eva 93 90 91 1.0 3.0 3.0 1.0 3.0 3.0 1.00 0.75 0.75
4. 总成绩排名
如果我们需要根据总成绩(例如所有科目成绩的和或平均值)进行排名,可以创建一个新的列,计算每个学生的总成绩或平均成绩,然后对其进行排名。
# 计算总成绩并进行排名
df['Total'] = df[['Math', 'English', 'Science']].sum(axis=1)
df['Total_Rank'] = df['Total'].rank(ascending=False)
print(df)
输出:
Student Math English Science Math_Rank English_Rank Science_Rank Math_Rank_Min English_Rank_Min Science_Rank_Min Math_Percent_Rank English_Percent_Rank Science_Percent_Rank Total Total_Rank
0 Alice 85 88 90 4.0 2.0 2.0 4.0 2.0 2.0 0.25 0.50 0.50 263.0 4.0
1 Bob 92 78 85 2.0 5.0 5.0 2.0 5.0 5.0 0.75 0.00 0.00 255.0 5.0
2 Charlie 78 92 88 5.0 1.0 4.0 5.0 1.0 4.0 0.00 1.00 0.25 258.0 3.0
3 David 88 85 92 3.0 4.0 1.0 3.0 4.0 1.0 0.50 0.25 1.00 265.0 2.0
4 Eva 93 90 91 1.0 3.0 3.0 1.0 3.0 3.0 1.00 0.75 0.75 274.0 1.0
总结
通过这个综合实战,我们展示了如何在 Pandas 中使用 排序与排名 函数来组织数据:
sort_values()
:按列值对数据进行排序。rank()
:为数据列分配排名,并支持多种排名方法。- 百分比排名:为每个数据计算百分比排名,表示数据在所有项中的相对位置。
Total_Rank
:通过计算总成绩进行排名,常用于综合分析。
这些方法可以广泛应用于数据清洗、分析和报告生成等场景。