Pandas 教程:掌握Python数据处理 – wiki词典

标题:Pandas教程:掌握Python数据处理


摘要

Pandas是Python编程语言中一个功能强大且广泛使用的数据处理库,它为数据分析提供了高效、灵活的数据结构。本文将深入探讨Pandas的核心概念、安装方法、主要数据结构(Series和DataFrame)、基本数据操作、数据清洗与预处理,以及高级应用。通过本教程,您将能够掌握Pandas,从而在数据科学、机器学习和数据分析项目中高效地处理和分析数据。


1. 引言:为什么选择Pandas?

在当今数据驱动的世界中,有效地处理、清洗和分析数据是至关重要的技能。Python作为数据科学领域的首选语言,拥有众多优秀库,其中Pandas无疑是数据处理的基石。

Pandas的优势在于:
* 高效的数据结构:提供Series(一维)和DataFrame(二维)两种核心数据结构,能轻松处理各种结构化数据。
* 强大的数据操作能力:支持灵活的索引、切片、合并、重塑、聚合等操作。
* 缺失数据处理:内置处理缺失值(NaN)的机制。
* 时间序列功能:对时间序列数据有优秀的内置支持。
* 数据导入/导出:方便地读写多种数据格式,如CSV、Excel、SQL数据库、JSON等。
* 与NumPy和Matplotlib集成:与Python科学计算生态系统无缝衔接。

无论您是数据分析师、数据科学家,还是对数据处理感兴趣的开发者,掌握Pandas都将极大地提升您的工作效率和数据洞察力。


2. 安装Pandas

在开始之前,确保您的Python环境已准备就绪。Pandas通常与Anaconda发行版一起安装,Anaconda是一个包含Python、Jupyter Notebook和众多科学计算库的集成环境。

如果您已经安装了Python,可以通过pip命令安装Pandas:

bash
pip install pandas

安装完成后,您可以在Python脚本或Jupyter Notebook中导入它:

python
import pandas as pd

约定俗成,Pandas通常以pd作为别名。


3. Pandas核心数据结构

Pandas主要提供两种数据结构:SeriesDataFrame

3.1 Series (一维数组)

Series是一种带标签的一维数组,可以存储任何数据类型(整数、浮点数、字符串、Python对象等)。它由两部分组成:数据和索引(标签)。

“`python
import pandas as pd
import numpy as np

从列表创建Series

s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(“Series from list:\n”, s)

从字典创建Series,字典的键将作为索引

data = {‘a’: 10, ‘b’: 20, ‘c’: 30}
s2 = pd.Series(data)
print(“\nSeries from dictionary:\n”, s2)

指定索引

s3 = pd.Series([10, 20, 30], index=[‘x’, ‘y’, ‘z’])
print(“\nSeries with custom index:\n”, s3)
“`

主要特性:
* 索引访问s[0]s['a']
* 值和索引s.valuess.index
* 标量操作:支持NumPy的各种运算,如 s * 2

3.2 DataFrame (二维表格)

DataFrame是Pandas中最常用的数据结构,它是一个带有标签的二维表格,可以看作是共享相同索引的Series对象的集合。它有行索引和列标签。DataFrame是处理电子表格、SQL表或R中的数据帧的理想选择。

“`python

从字典创建DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’],
‘Age’: [25, 30, 35, 40],
‘City’: [‘New York’, ‘Paris’, ‘London’, ‘Tokyo’]
}
df = pd.DataFrame(data)
print(“DataFrame from dictionary:\n”, df)

从列表的列表创建DataFrame,并指定列名

data_list = [
[‘Alice’, 25, ‘New York’],
[‘Bob’, 30, ‘Paris’],
[‘Charlie’, 35, ‘London’]
]
df2 = pd.DataFrame(data_list, columns=[‘Name’, ‘Age’, ‘City’])
print(“\nDataFrame from list of lists:\n”, df2)

查看DataFrame的基本信息

print(“\nDataFrame info:\n”)
df.info()
print(“\nDataFrame description:\n”, df.describe()) # 数值列的统计信息
print(“\nDataFrame head (first 3 rows):\n”, df.head(3)) # 查看前几行
print(“\nDataFrame tail (last 2 rows):\n”, df.tail(2)) # 查看后几行
“`

主要特性:
* 列访问df['Name']df.Name
* 行访问df.loc (通过标签) 或 df.iloc (通过整数位置)。
* 维度df.shape 返回 (行数, 列数)。
* 列类型df.dtypes


4. 基本数据操作

掌握DataFrame的基本操作是使用Pandas的关键。

4.1 数据选择与索引

4.1.1 列选择

“`python

选择单列

names = df[‘Name’]
print(“\nSelected ‘Name’ column:\n”, names)

选择多列

subset = df[[‘Name’, ‘City’]]
print(“\nSelected ‘Name’ and ‘City’ columns:\n”, subset)
“`

4.1.2 行选择 (使用.loc.iloc)

  • .loc:基于标签(索引名称和列名)进行选择。

    “`python

    选择单行 (按行索引标签)

    first_row = df.loc[0]
    print(“\nFirst row using .loc[0]:\n”, first_row)

    选择多行 (按行索引标签范围)

    rows_0_to_2 = df.loc[0:2] # 包含结束标签
    print(“\nRows 0 to 2 using .loc[0:2]:\n”, rows_0_to_2)

    选择特定行和列

    alice_city = df.loc[0, ‘City’]
    print(f”\nAlice’s city using .loc[0, ‘City’]: {alice_city}”)

    subset_loc = df.loc[1:3, [‘Name’, ‘Age’]]
    print(“\nSubset rows 1-3, columns ‘Name’, ‘Age’ using .loc:\n”, subset_loc)
    “`

  • .iloc:基于整数位置(从0开始)进行选择。

    “`python

    选择单行 (按行位置)

    second_row = df.iloc[1]
    print(“\nSecond row using .iloc[1]:\n”, second_row)

    选择多行 (按行位置范围)

    rows_0_to_2_iloc = df.iloc[0:3] # 不包含结束位置
    print(“\nRows 0 to 2 using .iloc[0:3]:\n”, rows_0_to_2_iloc)

    选择特定行和列

    bob_age = df.iloc[1, 1]
    print(f”\nBob’s age using .iloc[1, 1]: {bob_age}”)

    subset_iloc = df.iloc[1:4, [0, 2]] # 行1-3,列0和2
    print(“\nSubset rows 1-3, columns 0, 2 using .iloc:\n”, subset_iloc)
    “`

4.1.3 布尔索引 (条件选择)

“`python

选择年龄大于30的所有行

older_people = df[df[‘Age’] > 30]
print(“\nPeople older than 30:\n”, older_people)

组合条件

condition = (df[‘Age’] > 25) & (df[‘City’] == ‘Paris’)
paris_people = df[condition]
print(“\nPeople older than 25 and living in Paris:\n”, paris_people)

使用isin()方法选择多个值

london_or_tokyo = df[df[‘City’].isin([‘London’, ‘Tokyo’])]
print(“\nPeople living in London or Tokyo:\n”, london_or_tokyo)
“`

4.2 添加、删除和修改数据

“`python

添加新列

df[‘Salary’] = [50000, 60000, 70000, 80000]
print(“\nDataFrame after adding ‘Salary’ column:\n”, df)

修改现有列的值

df[‘Age’] = df[‘Age’] + 1 # 所有年龄加1
print(“\nDataFrame after modifying ‘Age’ column:\n”, df)

修改特定值

df.loc[0, ‘City’] = ‘San Francisco’
print(“\nDataFrame after modifying Alice’s city:\n”, df)

删除列

df_dropped_salary = df.drop(‘Salary’, axis=1) # axis=1 表示列,axis=0 表示行
print(“\nDataFrame after dropping ‘Salary’ column:\n”, df_dropped_salary)

删除行 (按索引)

df_dropped_row = df.drop(index=3) # 删除索引为3的行
print(“\nDataFrame after dropping row with index 3:\n”, df_dropped_row)
“`

4.3 缺失数据处理

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

“`python
df_missing = pd.DataFrame({
‘A’: [1, 2, np.nan, 4],
‘B’: [np.nan, 2, 3, 4],
‘C’: [1, 2, 3, 4]
})
print(“\nDataFrame with missing values:\n”, df_missing)

检查缺失值

print(“\nMissing values (isnull()):\n”, df_missing.isnull())
print(“\nNon-missing values (notnull()):\n”, df_missing.notnull())
print(“\nSum of missing values per column:\n”, df_missing.isnull().sum())

删除含有缺失值的行

df_dropped_na = df_missing.dropna()
print(“\nDataFrame after dropping rows with any NaN:\n”, df_dropped_na)

删除所有列都为NaN的行 (这里没有)

df_dropped_all_na = df_missing.dropna(how=’all’)
print(“\nDataFrame after dropping rows with all NaN:\n”, df_dropped_all_na)

填充缺失值

df_filled_zero = df_missing.fillna(0) # 用0填充
print(“\nDataFrame after filling NaN with 0:\n”, df_filled_zero)

df_filled_mean = df_missing[‘A’].fillna(df_missing[‘A’].mean()) # 用列的均值填充
print(“\nSeries ‘A’ after filling NaN with mean:\n”, df_filled_mean)

df_ffill = df_missing.fillna(method=’ffill’) # 用前一个有效值填充
print(“\nDataFrame after forward fill:\n”, df_ffill)
“`

4.4 数据聚合与分组 (GroupBy)

groupby()方法是Pandas中最强大的功能之一,它允许您根据一个或多个列的值对数据进行分组,然后对每个组执行聚合操作(如求和、计数、平均值等)。

“`python
data_agg = {
‘Category’: [‘A’, ‘B’, ‘A’, ‘B’, ‘A’, ‘B’],
‘Value’: [10, 20, 15, 25, 12, 22],
‘City’: [‘NY’, ‘LD’, ‘NY’, ‘LD’, ‘SF’, ‘SF’]
}
df_agg = pd.DataFrame(data_agg)
print(“\nOriginal DataFrame for aggregation:\n”, df_agg)

按’Category’分组并计算’Value’的平均值

grouped_avg = df_agg.groupby(‘Category’)[‘Value’].mean()
print(“\nAverage ‘Value’ by ‘Category’:\n”, grouped_avg)

按’Category’分组并计算多个统计量

grouped_multi_agg = df_agg.groupby(‘Category’)[‘Value’].agg([‘mean’, ‘sum’, ‘count’])
print(“\nMultiple aggregations by ‘Category’:\n”, grouped_multi_agg)

按多个列进行分组

grouped_two_cols = df_agg.groupby([‘Category’, ‘City’])[‘Value’].sum()
print(“\nSum ‘Value’ by ‘Category’ and ‘City’:\n”, grouped_two_cols)
“`


5. 数据清洗与预处理

数据清洗是数据分析的关键步骤,Pandas提供了丰富的工具。

5.1 数据类型转换

“`python
df_types = pd.DataFrame({
‘col1’: [‘1’, ‘2’, ‘3’],
‘col2’: [‘4.1’, ‘5.2’, ‘6.3’],
‘col3’: [‘True’, ‘False’, ‘True’]
})
print(“\nOriginal DataFrame types:\n”, df_types.dtypes)

将’col1’转换为整数

df_types[‘col1’] = df_types[‘col1’].astype(int)

将’col2’转换为浮点数

df_types[‘col2’] = pd.to_numeric(df_types[‘col2’])

将’col3’转换为布尔值

df_types[‘col3’] = df_types[‘col3’].astype(bool)

print(“\nDataFrame types after conversion:\n”, df_types.dtypes)
“`

5.2 字符串操作

Pandas Series对象具有.str属性,可以访问各种字符串方法。

“`python
s_str = pd.Series([‘ apple ‘, ‘banana ‘, ‘ cherry’])
print(“\nOriginal Series for string operations:\n”, s_str)

去除空白

s_stripped = s_str.str.strip()
print(“\nSeries after stripping whitespace:\n”, s_stripped)

转换为大写

s_upper = s_str.str.upper()
print(“\nSeries after converting to uppercase:\n”, s_upper)

检查是否包含子字符串

contains_an = s_str.str.contains(‘an’)
print(“\nSeries checking for ‘an’:\n”, contains_an)

替换

s_replace = s_str.str.replace(‘ ‘, ”)
print(“\nSeries after replacing spaces:\n”, s_replace)
“`

5.3 数据合并与连接

Pandas提供了merge()join()concat()等方法来组合DataFrame。

  • concat():用于堆叠(垂直或水平)DataFrame。

    “`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_rows = pd.concat([df1, df2])
    print(“\nConcatenated rows:\n”, result_concat_rows)

    result_concat_cols = pd.concat([df1, df2], axis=1) # 水平连接
    print(“\nConcatenated columns:\n”, result_concat_cols)
    “`

  • merge():基于一个或多个键列合并DataFrame,类似于SQL的JOIN操作。

    “`python
    df_left = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’, ‘K3’],
    ‘A’: [‘A0’, ‘A1’, ‘A2’, ‘A3’],
    ‘B’: [‘B0’, ‘B1’, ‘B2’, ‘B3’]})

    df_right = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K4’, ‘K5’],
    ‘C’: [‘C0’, ‘C1’, ‘C2’, ‘C3’],
    ‘D’: [‘D0’, ‘D1’, ‘D2’, ‘D3’]})

    内连接 (Inner Join) – 只保留两个DataFrame中key都存在的行

    merged_inner = pd.merge(df_left, df_right, on=’key’, how=’inner’)
    print(“\nInner Merged DataFrame:\n”, merged_inner)

    外连接 (Outer Join) – 保留所有行,缺失值用NaN填充

    merged_outer = pd.merge(df_left, df_right, on=’key’, how=’outer’)
    print(“\nOuter Merged DataFrame:\n”, merged_outer)
    “`


6. 高级应用与技巧

6.1 时间序列分析

Pandas对日期和时间数据有出色的支持,to_datetime()函数可以将字符串转换为datetime对象。

“`python

创建一个日期范围

dates = pd.date_range(‘20230101’, periods=6)
df_ts = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list(‘ABCD’))
print(“\nTime Series DataFrame:\n”, df_ts)

时间序列索引和切片

print(“\nSelecting data for ‘2023-01-02’:\n”, df_ts.loc[‘2023-01-02’])
print(“\nSelecting data for Jan 2023:\n”, df_ts.loc[‘2023-01’])
“`

6.2 apply() 方法

apply()方法可以在DataFrame或Series的行/列上应用函数。

“`python
def multiply_by_two(x):
return x * 2

df_apply = pd.DataFrame({‘A’: [1, 2, 3], ‘B’: [4, 5, 6]})
print(“\nOriginal DataFrame for apply:\n”, df_apply)

对所有元素应用函数

df_applied = df_apply.apply(multiply_by_two)
print(“\nDataFrame after applying multiply_by_two:\n”, df_applied)

对列应用函数 (例如计算每列的和)

col_sum = df_apply.apply(lambda x: x.sum(), axis=0)
print(“\nSum of each column using apply:\n”, col_sum)

对行应用函数 (例如计算每行的最大值)

row_max = df_apply.apply(lambda x: x.max(), axis=1)
print(“\nMax of each row using apply:\n”, row_max)
“`

6.3 数据透视表 (Pivot Table)

数据透视表是强大的数据汇总工具,类似于电子表格中的透视表功能。

“`python
df_pivot = pd.DataFrame({
‘Date’: [‘2023-01-01’, ‘2023-01-01’, ‘2023-01-02’, ‘2023-01-02’],
‘Region’: [‘East’, ‘West’, ‘East’, ‘West’],
‘Sales’: [100, 150, 120, 180]
})
print(“\nOriginal DataFrame for pivot:\n”, df_pivot)

创建数据透视表:按日期和区域查看销售额总和

pivot_table = pd.pivot_table(df_pivot, values=’Sales’, index=’Date’, columns=’Region’, aggfunc=’sum’)
print(“\nPivot Table (Sales by Date and Region):\n”, pivot_table)
“`


7. 数据输入/输出

Pandas支持多种文件格式的读写。

“`python

写入CSV文件

df.to_csv(‘my_data.csv’, index=False) # index=False 不写入行索引

从CSV文件读取

df_from_csv = pd.read_csv(‘my_data.csv’)
print(“\nDataFrame read from CSV:\n”, df_from_csv)

写入Excel文件

df.to_excel(‘my_data.xlsx’, sheet_name=’Sheet1′, index=False)

从Excel文件读取

df_from_excel = pd.read_excel(‘my_data.xlsx’, sheet_name=’Sheet1′)
print(“\nDataFrame read from Excel:\n”, df_from_excel)

其他格式:read_json(), to_json(), read_sql(), to_sql() 等

“`


8. 总结

Pandas是Python数据处理生态系统中的核心工具。通过本教程,您应该已经对Pandas的核心概念、数据结构、基本操作、数据清洗技巧以及高级应用有了全面的理解。从导入数据到进行复杂的聚合和转换,Pandas提供了您所需的一切,以高效、直观的方式处理和分析结构化数据。

继续学习和实践是掌握Pandas的关键。建议您:
* 阅读Pandas官方文档。
* 在实际项目中运用Pandas处理真实数据集。
* 参与Kaggle等数据科学竞赛,提升实战能力。

祝您在数据探索之旅中取得丰硕成果!

—I have provided the article about the Pandas tutorial. Do you need any further assistance or modifications to the article?

滚动至顶部