Python
Pandas 排名: 高效排名的初学者指南

Pandas 排名: 高效排名的初学者指南

MoeNagy Dev

Pandas 排名: 理解和应用排名函数

Pandas 排名: 排名函数简介

数据分析中排名的概述

排名是数据分析的一项基本技术,它为数据集中的每个元素分配相对位置或顺序。它是一种强大的工具,可用于理解值的分布、识别异常值,并根据数据点的相对性能做出明智的决策。

排名在数据操作和决策中的重要性

Pandas 中的排名函数(如 rank() 函数)在各种数据操作和决策任务中发挥关键作用。它们允许您:

  • 了解数据点在数据集中的相对位置
  • 识别表现最佳或最差的元素
  • 分析值的分布并检测任何异常情况
  • 促进不同数据点之间的比较和基准测试
  • 通过提供明确的排名层次结构来支持决策过程

Pandas 排名: rank() 函数

了解 rank() 函数

Pandas 中的 rank() 函数是一个多功能工具,允许您为 Series 或 DataFrame 中的元素分配排名。它提供了一种灵活的方式来根据相对值对数据点进行排序和比较。

rank() 函数的语法和参数

Pandas 中 rank() 函数的语法如下:

DataFrame.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)

以下是主要参数的简要说明:参数:

  • axis: 确定排名的方向(0 表示行, 1 表示列)。
  • method: 指定处理排名过程中并列情况的方法。
  • numeric_only: 确定是只对数字列进行排名还是对所有列进行排名。
  • na_option: 指定如何处理缺失值(NaN)。
  • ascending: 确定排名顺序(True 表示升序, False 表示降序)。
  • pct: 计算百分位排名而不是标准排名。

Pandas 排名: 排名方法

method='average': 为并列值分配平均排名

当数据集中存在并列值时, method='average' 选项会为这些并列元素分配平均排名。这意味着, 如果多个元素具有相同的值, 它们将获得它们在不并列情况下应获得的排名的平均值。

示例:

import pandas as pd
 
data = {'Score': [90, 85, 85, 80, 75]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(method='average')
print(df)

输出:

   Score  Rank
0     90   5.0
1     85   2.5
2     85   2.5
3     80   4.0
4     75   1.0

method='min': 为并列值分配最小排名

method='min' 选项为并列元素分配最小排名。这意味着, 如果多个元素具有相同的值, 它们将获得它们在不并列情况下应获得的最低排名。

示例:

import pandas as pd
 
data = {'Score': [90, 85, 85, 80, 75]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(method='min')
print(df)

输出:

   Score  Rank
0     90   5.0
1     85   2.0
2     85   2.0
3     80   4.0
4     75   1.0

method='max': 为并列值分配最大排名

method='max' 选项为并列元素分配最大排名。这意味着, 如果多个元素具有相同的值, 它们将获得它们在不并列情况下应获得的最高排名。

示例:

import pandas as pd
 
data = {'Sc.
```python
data = {'Score': [90, 85, 85, 80, 75]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(method='max')
print(df)

输出:

   Score  Rank
0     90   5.0
1     85   3.0
2     85   3.0
3     80   4.0
4     75   1.0

method='dense': 为并列值分配下一个连续的排名

method='dense' 选项会为并列的元素分配下一个可用的排名,跳过原本应该分配给并列元素的排名。

示例:

import pandas as pd
 
data = {'Score': [90, 85, 85, 80, 75]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(method='dense')
print(df)

输出:

   Score  Rank
0     90   5.0
1     85   4.0
2     85   4.0
3     80   3.0
4     75   1.0

method='first': 根据元素出现顺序分配排名

method='first' 选项会根据元素在数据集中的出现顺序分配排名,而不是根据实际值。

示例:

import pandas as pd
 
data = {'Score': [90, 85, 85, 80, 75]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(method='first')
print(df)

输出:

   Score  Rank
0     90   5.0
1     85   2.0
2     85   3.0
3     80   4.0
4     75   1.0

Pandas rank: 处理缺失值

处理 NaN (Not a Number) 值的排名

Pandas 的 rank() 函数提供了几种选项来处理缺失值 (NaN) 在排名过程中的情况。

method='dense' 和缺失值

使用 method='dense' 选项时,rank() 函数会跳过对应于缺失值的排名,为非缺失值分配下一个可用的排名。

示例:

import pandas as pd
import numpy as np
 
data = {'Score': [90, 85, np.nan, 80, 75]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(method='dense')
print(df)

'] = df['Score'].rank(method='dense') print(df)

输出:

Score Rank 0 90.0 4.0 1 85.0 3.0 2 NaN NaN 3 80.0 2.0 4 75.0 1.0


#### 考虑和不考虑缺失值的排名
您可以使用 `na_option` 参数控制 `rank()` 函数中对缺失值的处理。可用选项有:
- `'keep'` (默认): 保留缺失值并将其分配一个 NaN 排名。
- `'top'`: 将缺失值视为最小可能值,并将其排在最前。
- `'bottom'`: 将缺失值视为最大可能值,并将其排在最后。

示例:
```python
import pandas as pd

data = {'Score': [90, 85, np.nan, 80, 75]}
df = pd.DataFrame(data)

# 保留缺失值的排名
df['Rank_keep'] = df['Score'].rank(na_option='keep')

# 将缺失值视为最小值的排名
df['Rank_top'] = df['Score'].rank(na_option='top')

# 将缺失值视为最大值的排名
df['Rank_bottom'] = df['Score'].rank(na_option='bottom')

print(df)

输出:

     Score  Rank_keep  Rank_top  Rank_bottom
0     90.0       4.0       4.0          5.0
1     85.0       3.0       3.0          4.0
2       NaN       NaN       1.0          1.0
3     80.0       2.0       2.0          3.0
4     75.0       1.0       1.0          2.0

Pandas 排名: 按列排名

按多列对 DataFrame 进行排名

Pandas 中的 rank() 函数也可用于根据多列的值对 DataFrame 的行进行排名。这允许您建立更复杂的排名层次。

示例:

import pandas as pd
 
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
        'Score': [90, 85, 92, 88, 85],
        'Age': [25, 30, 28, 35, 27]}
df = pd.DataFrame(data)
 
# 按多列对 DataFrame 进行排名
df['Rank'] = df.rank(method='average', ascending=False)['Score']
print(df)

输出:

       Name  Score  Age  Rank
0    Alice     90   25   1.0
2  Charlie     92   28  .

2.0 3 David 88 35 3.0 1 Bob 85 30 4.5 4 Eve 85 27 4.5

为每列指定排名顺序

您还可以在通过多列对 DataFrame 进行排名时,单独控制每列的排名顺序(升序或降序)。

示例:

import pandas as pd
 
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
        'Score': [90, 85, 92, 88, 85],
        'Age': [25, 30, 28, 35, 27]}
df = pd.DataFrame(data)
 
# 通过多列以不同的排名顺序对 DataFrame 进行排名
df['Rank'] = df.rank(method='average', ascending=[False, True])['Score']
print(df)

输出:

       Name  Score  Age  Rank
0    Alice     90   25   1.0
2  Charlie     92   28   2.0
3    David     88   35   3.0
1      Bob     85   30   4.5
4      Eve     85   27   4.5

Pandas 排名: 分组排名

在组内或数据子集中进行排名

rank() 函数可以与 groupby() 函数结合使用,在特定组或 DataFrame 的子集内执行排名。

示例:

import pandas as pd
 
data = {'Department': ['Sales', 'Sales', 'Marketing', 'Marketing', 'IT', 'IT'],
        'Score': [90, 85, 92, 88, 85, 92]}
df = pd.DataFrame(data)
 
# 在每个部门内对分数进行排名
df['Rank'] = df.groupby('Department')['Score'].rank(method='average')
print(df)

输出:

   Department  Score  Rank
0       Sales     90   2.0
1       Sales     85   1.0
2    Marketing     92   2.0
3    Marketing     88   1.0
4           IT     85   1.0
5           IT     92   2.0

结合 groupby()rank() 函数

通过结合使用 groupby()rank() 函数,您可以执行更复杂的排名操作,例如在子组或嵌套组内进行排名。

示例:

import pandas as pd
 
data = {'Department': ['Sales', 'Sales', 'Marketing', 'Marketing', 'IT', 'IT'],
        'Team': ['East', 'West', 'North', 'South', 'Central', 'Remote'],
        'Score':.
[90, 85, 92, 88, 85, 92]}
df = pd.DataFrame(data)
 
# 对每个部门和团队内的分数进行排名
df['Rank'] = df.groupby(['Department', 'Team'])['Score'].rank(method='average')
print(df)

输出:

   Department   Team  Score  Rank
0       销售    东部     90   2.0
1       销售    西部     85   1.0
2    市场营销   北部     92   2.0
3    市场营销   南部     88   1.

## 文件操作

### 读写文件
在 Python 中,您可以使用内置的 `open()` 函数来读写文件。`open()` 函数需要两个参数:文件路径和打开文件的模式。

以下是一个读取文件的示例:

```python
# 以读取模式打开文件
file = open('example.txt', 'r')

# 读取文件内容
content = file.read()

# 打印文件内容
print(content)

# 关闭文件
file.close()

在这个示例中,我们以读取模式 ('r') 打开 example.txt 文件,使用 read() 方法读取其内容,然后打印出来。最后,我们使用 close() 方法关闭文件。

要写入文件,可以使用写入模式 ('w'):

# 以写入模式打开文件
file = open('example.txt', 'w')
 
# 向文件写入一些文本
file.write('这是要写入文件的一些文本。')
 
# 关闭文件
file.close()

在这个示例中,我们以写入模式 ('w') 打开 example.txt 文件,使用 write() 方法向其写入一些文本,然后关闭文件。

文件模式

open() 函数支持不同的文件模式,这些模式决定了文件的打开和访问方式:

  • 'r': 读取模式(默认)
  • 'w': 写入模式(覆盖现有文件或创建新文件)
  • 'a': 追加模式(在文件末尾添加内容)
  • 'x': 独占创建模式(创建新文件,如果文件已存在则失败)
  • 'b': 二进制模式(用于处理二进制文件)
  • 't': 文本模式(用于处理文本文件,默认)
  • '+': 读写模式(打开文件进行读写).

处理文件路径

在 Python 中,您可以使用绝对路径和相对路径来处理文件。绝对路径从根目录开始,而相对路径从当前工作目录开始。

下面是使用相对文件路径的示例:

# 打开当前目录中的文件
file = open('example.txt', 'r')
content = file.read()
file.close()
 
# 打开子目录中的文件
file = open('data/example.txt', 'r')
content = file.read()
file.close()

您也可以使用 os 模块更有效地处理文件路径:

import os
 
# 获取当前工作目录
current_dir = os.getcwd()
print(current_dir)
 
# 拼接路径创建完整的文件路径
file_path = os.path.join(current_dir, 'data', 'example.txt')
file = open(file_path, 'r')
content = file.read()
file.close()

在这个示例中,我们使用 os.getcwd() 函数获取当前工作目录,然后使用 os.path.join() 函数通过连接当前目录、子目录 'data' 和文件名 'example.txt' 来创建完整的文件路径。

处理文件异常

在处理文件时,需要处理可能发生的异常,例如文件不存在或没有权限访问。您可以使用 try-except 块来捕获和处理这些异常:

try:
    file = open('example.txt', 'r')
    content = file.read()
    print(content)
    file.close()
except FileNotFoundError:
    print('错误: 文件未找到。')
except PermissionError:
    print('错误: 您没有权限访问该文件。')

在这个示例中,我们将文件相关的操作包裹在 try 块中。如果发生 FileNotFoundErrorPermissionError 异常,相应的 except 块将处理异常并打印错误消息。

处理目录

创建和导航目录

除了处理文件,您还可以在 Python 中处理目录(文件夹)。 使用 os 模块进行 Python 编程。

这里是一个创建新目录并导航到该目录的示例:

import os
 
# 创建一个新目录
os.mkdir('new_directory')
 
# 更改当前工作目录
os.chdir('new_directory')
 
# 获取当前工作目录
current_dir = os.getcwd()
print(current_dir)

在这个示例中,我们使用 os.mkdir() 函数创建一个名为 'new_directory' 的新目录,然后使用 os.chdir() 函数将当前工作目录更改为新目录。最后,我们使用 os.getcwd() 函数获取当前工作目录并将其打印出来。

列出目录内容

您可以使用 os.listdir() 函数列出目录的内容:

import os
 
# 列出当前目录的内容
contents = os.listdir()
print(contents)
 
# 列出特定目录的内容
directory = 'data'
contents = os.listdir(directory)
print(contents)

在这个示例中,我们首先使用 os.listdir() 函数(不带任何参数)列出当前目录的内容。然后,我们通过将目录路径作为参数传递给 os.listdir() 来列出 'data' 目录的内容。

删除目录

您可以使用 os.rmdir() 函数删除一个空目录,并使用 shutil 模块中的 shutil.rmtree() 函数递归地删除一个目录及其所有内容:

import os
import shutil
 
# 删除一个空目录
os.rmdir('empty_directory')
 
# 删除一个非空目录及其所有内容
shutil.rmtree('non_empty_directory')

在这个示例中,我们使用 os.rmdir() 删除一个名为 'empty_directory' 的空目录,并使用 shutil.rmtree() 删除一个名为 'non_empty_directory' 的非空目录及其所有内容。

处理文件系统

检查文件是否存在

您可以使用 os.path.exists() 函数检查文件或目录是否存在:

import os
 
# 检查文件是否存在
file_path = 'example.txt'
if os.path.exists(file_path):
    print(f"The file {file_path} exists.")
else:
    print(f"The file {file_path} does not exist.")
# 检查文件是否存在
file_path = 'example.txt'
if os.path.exists(file_path):
    print(f'文件 "{file_path}" 存在。')
else:
    print(f'文件 "{file_path}" 不存在。')
 
# 检查目录是否存在
dir_path = 'data'
if os.path.exists(dir_path):
    print(f'目录 "{dir_path}" 存在。')
else:
    print(f'目录 "{dir_path}" 不存在。')

在这个示例中,我们使用 os.path.exists() 来检查文件 'example.txt' 和目录 'data' 是否存在。

获取文件信息

您可以使用 os.path.getsize() 函数获取文件大小,使用 os.path.getmtime() 函数获取文件最后修改时间:

import os
from datetime import datetime
 
# 获取文件大小
file_path = 'example.txt'
file_size = os.path.getsize(file_path)
print(f'文件 "{file_path}" 的大小为 {file_size} 字节。')
 
# 获取文件最后修改时间
last_modified = os.path.getmtime(file_path)
last_modified_datetime = datetime.fromtimestamp(last_modified)
print(f'文件 "{file_path}" 最后修改于 {last_modified_datetime}。')

在这个示例中,我们使用 os.path.getsize() 获取文件 'example.txt' 的大小(以字节为单位),使用 os.path.getmtime() 获取文件的最后修改时间,并使用 datetime 模块将其转换为可读的日期时间格式。

复制、移动和重命名文件

您可以使用 shutil 模块来复制、移动和重命名文件:

import shutil
 
# 复制文件
shutil.copy('example.txt', 'example_copy.txt')
 
# 移动文件
shutil.move('example.txt', 'data/example.txt')
 
# 重命名文件
shutil.move('example_copy.txt', 'renamed_file.txt')

在这个示例中,我们使用 shutil.copy() 函数创建了 'example.txt' 文件的副本,使用 shutil.move() 函数将 'example.txt' 文件移动到 'data' 目录,再次使用 shutil.move() 函数将 'example_copy.txt' 文件重命名为 'renamed_file.txt'

结论

在本教程中,您已经学习了如何使用 Python 处理文件和目录。使用内置的 open() 函数以及 osshutil 模块在 Python 中管理目录。您已经了解了如何读取和写入文件、处理文件路径以及管理文件和目录操作,如创建、删除和列出内容。

这些与文件相关的技能对于许多 Python 应用程序都是必不可少的,从数据处理和分析到系统管理任务。通过掌握这些技术,您可以有效地管理和操作文件和目录,使您的 Python 程序更加强大和多功能。

请务必处理与文件相关的异常,因为它们可能经常发生并导致代码出现意外行为。此外,在处理文件系统时,请注意文件权限和访问权限。

通过本教程获得的知识,您现在已经具备了处理各种基于文件的任务以及将文件处理无缝集成到您的 Python 项目中的能力。

MoeNagy Dev.