Pandas新手教程:轻松掌握数据科学利器 – wiki大全


Pandas新手教程:轻松掌握数据科学利器

在当今数据驱动的世界里,数据科学已成为各行各业不可或缺的一部分。而作为Python数据科学生态系统中的核心库之一,Pandas凭借其强大的数据处理能力,成为了每一位数据科学家、分析师和工程师的必备工具。本文将为Pandas新手提供一份详尽的入门教程,帮助你轻松掌握这一数据科学利器。

1. 什么是Pandas?

Pandas是一个开源的Python库,主要用于数据分析和数据操作。它建立在NumPy库之上,提供了高性能、易于使用的数据结构和数据分析工具。Pandas最核心的两个数据结构是 SeriesDataFrame

  • Series (序列):一维带标签的数组,可以存储任何数据类型(整数、字符串、浮点数、Python对象等)。它类似于Python中的列表或NumPy数组,但拥有一个与之关联的索引(标签)。
  • DataFrame (数据帧):二维带标签的数据结构,可以看作是Series的容器,其中每个Series共享相同的索引。它类似于电子表格、SQL表或R中的数据帧,由行和列组成。

2. 安装Pandas

在开始之前,你需要安装Pandas。推荐使用pip或conda进行安装:

使用pip:
bash
pip install pandas

使用conda (如果你使用Anaconda环境):
bash
conda install pandas

安装完成后,在Python脚本或Jupyter Notebook中导入Pandas:
python
import pandas as pd

pd 是Pandas约定俗成的别名,这样可以简化后续的代码书写。

3. Pandas核心数据结构:Series入门

3.1 创建Series

你可以通过多种方式创建Series:

从列表创建:
python
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

输出:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64

从字典创建 (键作为索引):
python
data = {'a': 10, 'b': 20, 'c': 30}
s_dict = pd.Series(data)
print(s_dict)

输出:
a 10
b 20
c 30
dtype: int64

指定索引:
python
s_indexed = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s_indexed)

输出:
x 10
y 20
z 30
dtype: int64

3.2 访问Series数据

可以通过索引或位置访问Series中的元素:

python
print(s_indexed['y']) # 通过标签索引
print(s_indexed[1]) # 通过位置索引 (类似列表)

输出:
20
20

4. Pandas核心数据结构:DataFrame入门

DataFrame是Pandas中最常用的数据结构,它能够存储和操作表格型数据。

4.1 创建DataFrame

从字典创建 (常用方式):
字典的键将成为列名,列表将成为列数据。
python
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, 27, 22, 32],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)
print(df)

输出:
Name Age City
0 Alice 24 New York
1 Bob 27 Los Angeles
2 Charlie 22 Chicago
3 David 32 Houston

从列表的列表创建 (需要指定列名):
python
data_list = [['Alice', 24], ['Bob', 27], ['Charlie', 22]]
df_list = pd.DataFrame(data_list, columns=['Name', 'Age'])
print(df_list)

输出:
Name Age
0 Alice 24
1 Bob 27
2 Charlie 22

4.2 读取外部数据

Pandas最强大的功能之一是能够轻松读取各种数据格式。CSV文件是最常见的数据源:

“`python

假设你有一个名为 ‘data.csv’ 的文件

data.csv 内容示例:

Name,Age,City

Alice,24,New York

Bob,27,Los Angeles

Charlie,22,Chicago

可以先创建一个模拟的CSV文件进行测试

import os
csv_content = “””Name,Age,City
Alice,24,New York
Bob,27,Los Angeles
Charlie,22,Chicago
“””
with open(‘sample_data.csv’, ‘w’) as f:
f.write(csv_content)

df_csv = pd.read_csv(‘sample_data.csv’)
print(df_csv)

删除模拟文件

os.remove(‘sample_data.csv’)
“`

Pandas还支持 read_excel(), read_sql_table(), read_json(), read_html() 等函数来读取不同格式的数据。

4.3 查看DataFrame信息

在处理数据之前,了解其结构和内容至关重要:

  • df.head(): 查看前5行数据 (默认),df.head(n) 可以查看前n行。
  • df.tail(): 查看后5行数据 (默认)。
  • df.info(): 获取DataFrame的简洁摘要,包括列的Dtype、非空值数量和内存使用情况。
  • df.describe(): 生成描述性统计信息,包括计数、均值、标准差、最小值、最大值和四分位数。
  • df.shape: 返回一个元组,表示DataFrame的维度 (行数, 列数)。
  • df.columns: 返回所有列名。
  • df.index: 返回行索引。

python
print("Head:\n", df.head())
print("\nInfo:\n")
df.info()
print("\nDescription:\n", df.describe())
print("\nShape:", df.shape)
print("\nColumns:", df.columns)

5. 数据选择与过滤

这是数据分析中最频繁的操作之一。

5.1 选择列

  • 单个列:返回一个Series。
    python
    print(df['Name'])
    # 或者使用点表示法 (如果列名不含空格且不是Pandas关键字)
    # print(df.Name)
  • 多个列:返回一个DataFrame。
    python
    print(df[['Name', 'Age']])

5.2 选择行

Pandas提供了 loc (基于标签) 和 iloc (基于整数位置) 两种主要的行选择方法。

  • loc (基于标签)
    “`python
    # 选择索引为0的行
    print(df.loc[0])

    选择多行

    print(df.loc[[0, 2]])

    基于条件选择行 (非常强大)

    选择年龄大于25的行

    print(df.loc[df[‘Age’] > 25])
    “`

  • iloc (基于整数位置)
    “`python
    # 选择第0行
    print(df.iloc[0])

    选择第0行和第2行

    print(df.iloc[[0, 2]])

    切片选择行 (类似Python列表切片)

    print(df.iloc[0:2]) # 选择第0行到第1行
    “`

5.3 组合选择 (行和列)

“`python

选择年龄大于25的Name和City列

print(df.loc[df[‘Age’] > 25, [‘Name’, ‘City’]])

选择第0到第1行的Name列

print(df.iloc[0:2, 0])
“`

6. 数据处理与清洗

真实世界的数据往往是混乱的,需要进行清洗和预处理。

6.1 处理缺失值

缺失值通常表示为 NaN (Not a Number)。

  • df.isnull(): 返回一个布尔型DataFrame,表示每个位置是否为缺失值。
  • df.dropna(): 删除含有缺失值的行或列。
    • df.dropna(): 默认删除至少含有一个NaN值的行。
    • df.dropna(how='all'): 只删除所有值都是NaN的行。
    • df.dropna(axis=1): 删除含有NaN值的列。
  • df.fillna(value): 填充缺失值。
    • df.fillna(0): 用0填充所有NaN。
    • df.fillna(df['Age'].mean()): 用’Age’列的均值填充该列的NaN。
    • df.fillna(method='ffill'): 使用前一个有效值填充 (向前填充)。
    • df.fillna(method='bfill'): 使用后一个有效值填充 (向后填充)。

“`python

创建一个有缺失值的DataFrame

data_missing = {
‘A’: [1, 2, np.nan, 4],
‘B’: [np.nan, 6, 7, 8],
‘C’: [9, 10, 11, 12]
}
df_missing = pd.DataFrame(data_missing)
print(“Original:\n”, df_missing)

print(“\nIs null:\n”, df_missing.isnull())
print(“\nDropped NA rows:\n”, df_missing.dropna())
print(“\nFilled NA with 0:\n”, df_missing.fillna(0))
print(“\nFilled NA with column B mean:\n”, df_missing[‘B’].fillna(df_missing[‘B’].mean()))
“`

6.2 更改数据类型

使用 astype() 方法可以更改列的数据类型。

python
df['Age'] = df['Age'].astype(float)
print(df.dtypes)

6.3 重命名列

使用 df.rename() 方法。

python
df_renamed = df.rename(columns={'Name': 'Full Name', 'City': 'Location'})
print(df_renamed)

7. 数据排序

使用 sort_values() 对DataFrame进行排序。

“`python

按Age列升序排序

df_sorted_age = df.sort_values(by=’Age’)
print(“\nSorted by Age (ascending):\n”, df_sorted_age)

按Age列降序排序

df_sorted_age_desc = df.sort_values(by=’Age’, ascending=False)
print(“\nSorted by Age (descending):\n”, df_sorted_age_desc)

按多列排序

df_sorted_multi = df.sort_values(by=[‘City’, ‘Age’])
print(“\nSorted by City then Age:\n”, df_sorted_multi)
“`

8. 分组与聚合

groupby() 是Pandas中一个极其强大的功能,用于根据一个或多个键对DataFrame进行分组,然后对每个组执行聚合操作 (如求和、均值、计数等)。

“`python
data_sales = {
‘Region’: [‘East’, ‘West’, ‘East’, ‘West’, ‘East’, ‘South’],
‘Product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘B’, ‘A’],
‘Sales’: [100, 150, 120, 200, 130, 80]
}
df_sales = pd.DataFrame(data_sales)
print(“Original Sales Data:\n”, df_sales)

按Region分组,并计算每个Region的总销售额

total_sales_by_region = df_sales.groupby(‘Region’)[‘Sales’].sum()
print(“\nTotal Sales by Region:\n”, total_sales_by_region)

按Region和Product分组,计算平均销售额

avg_sales_by_region_product = df_sales.groupby([‘Region’, ‘Product’])[‘Sales’].mean()
print(“\nAverage Sales by Region and Product:\n”, avg_sales_by_region_product)

对多个聚合函数应用

agg_results = df_sales.groupby(‘Region’).agg(
total_sales=(‘Sales’, ‘sum’),
average_sales=(‘Sales’, ‘mean’),
num_products=(‘Product’, ‘count’)
)
print(“\nAggregated Results by Region:\n”, agg_results)
“`

9. 合并与连接

在实际数据分析中,我们经常需要将来自不同源的数据集合并起来。

  • pd.concat(): 沿着某个轴将Pandas对象连接起来。
    python
    df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']}, index=[0, 1])
    df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']}, index=[2, 3])
    result_concat = pd.concat([df1, df2])
    print("\nConcatenated DataFrames:\n", result_concat)

  • pd.merge(): 类似于SQL的JOIN操作,根据一个或多个键合并DataFrame。
    “`python
    df_customers = pd.DataFrame({‘customer_id’: [1, 2, 3], ‘name’: [‘Alice’, ‘Bob’, ‘Charlie’]})
    df_orders = pd.DataFrame({‘order_id’: [101, 102, 103], ‘customer_id’: [1, 3, 2], ‘amount’: [50, 75, 120]})

    merged_df = pd.merge(df_customers, df_orders, on=’customer_id’)
    print(“\nMerged DataFrames (Inner Join):\n”, merged_df)

    不同的合并类型 (how参数: ‘inner’, ‘left’, ‘right’, ‘outer’)

    “`

10. 应用函数

Pandas提供了多种方式对数据应用函数,实现更复杂的转换。

  • apply(): 用于Series或DataFrame的行/列。
    “`python
    # 对一列应用函数 (Series)
    df[‘Age_in_5_years’] = df[‘Age’].apply(lambda x: x + 5)
    print(“\nAge in 5 years:\n”, df)

    对DataFrame的每一行或每一列应用函数

    假设我们想计算每个人的名字长度和城市名长度之和

    df[‘Name_City_Len’] = df.apply(lambda row: len(row[‘Name’]) + len(row[‘City’]), axis=1)
    print(“\nName and City Length Sum:\n”, df)
    “`

  • map(): 仅用于Series,将Series中的每个值映射到另一个值。
    python
    city_mapping = {'New York': 'NY', 'Los Angeles': 'LA', 'Chicago': 'CHI', 'Houston': 'HOU'}
    df['City_Abbr'] = df['City'].map(city_mapping)
    print("\nCity Abbreviations:\n", df)

总结

本教程涵盖了Pandas的基本概念、核心数据结构 (Series和DataFrame) 的创建与操作、数据选择与过滤、缺失值处理、数据排序、强大的分组聚合以及数据合并与函数应用。

Pandas是数据科学的基石,掌握它将极大地提高你处理和分析数据的效率。从现在开始,你可以尝试用Pandas加载真实数据集,进行探索性数据分析,并逐步深入学习其更多高级功能,例如时间序列分析、窗口函数等。实践是最好的老师,祝你在数据科学的旅程中一帆风顺!


滚动至顶部