python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Pandas数据处理

Python数据处理工具之Pandas的使用详细指南

作者:卜及中

Pandas 是Python中最流行的数据处理和分析库之一,它提供了高效、灵活且易于使用的数据结构,使得数据清洗、分析和处理变得简单直观,下面小编就和大家详细介绍一下它的具体应用吧

一、前言

1.1 什么是Pandas?

Pandas 是Python中最流行的数据处理和分析库之一,它提供了高效、灵活且易于使用的数据结构,使得数据清洗、分析和处理变得简单直观。Pandas的名字来源于"Panel Data"(面板数据)和"Python Data Analysis"(Python数据分析)的组合。

Pandas最初由Wes McKinney于2008年开发,现已成为数据科学领域的标准工具之一,广泛应用于金融、统计、社会科学和许多工程领域。

下面是Pandas的使用与相关接口进行介绍,很多接口的参数较多与复杂,这里只对部分进行解释,感兴趣的话可以去看官方文档:pandas documentation

1.2 安装Pandas

在开始使用Pandas之前,需要先安装它。直接通过pip安装即可:

pip install pandas
# 如果使用Anaconda发行版
conda install pandas

二、Pandas 数据相关

2.1 Pandas核心数据结构

Pandas有两个主要的数据结构:SeriesDataFrame

Series

Series是一维的标签化数组,可以保存任何数据类型(整数、字符串、浮点数、Python对象等)。

import pandas as pd

# 创建一个Series
s = pd.Series([1, 3, 5, 7, 9])
print(s)

输出结果:

0    1
1    3
2    5
3    7
4    9
dtype: int64

DataFrame

DataFrame是一个二维的标签化数据结构,可以看作是由多个Series组成的字典。

# 创建一个DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Paris', 'London', 'Tokyo']
}

df = pd.DataFrame(data)
print(df)

输出结果:

      Name  Age      City
0    Alice   25  New York
1      Bob   30     Paris
2  Charlie   35    London
3    David   40     Tokyo

2.2 数据读取与写入

Pandas支持多种数据格式的读写操作:

# 读取CSV文件
df = pd.read_csv('data.csv')

# 读取Excel文件
df = pd.read_excel('data.xlsx')

# 读取JSON文件
df = pd.read_json('data.json')

# 写入CSV文件
df.to_csv('output.csv', index=False)

# 写入Excel文件
df.to_excel('output.xlsx', index=False)

2.3 数据探索与清洗

查看数据

df.head()

df.head(n=5)  # n: 要显示的前n行,默认为5

df.tail()

df.tail(n=5)  # n: 要显示的后n行,默认为5

df.info()

df.info(verbose=None, buf=None, max_cols=None, memory_usage=None, show_counts=None)  # 查看数据的基本信息

df.describe()

df.describe(percentiles=None, include=None, exclude=None)  # 查看数据的统计摘要

处理缺失值

# 检查缺失值
df.isnull().sum()

# 删除包含缺失值的行
df.dropna()

# 填充缺失值
df.fillna(value)

数据筛选

# 选择单列
df['column_name']

# 选择多列
df[['col1', 'col2']]

# 条件筛选
df[df['Age'] > 30]

# 使用loc和iloc
df.loc[row_indexer, column_indexer]
df.iloc[row_position, column_position]

2.4 数据操作

1. 排序:

df.sort_values

df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)  # 对数据进行排序

代码示例

假设有一个名为 df 的 DataFrame,其中包含了员工的姓名、年龄和薪水信息:

import pandas as pd

# 创建示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 30, 35, 40, 28],
    'Salary': [50000, 60000, 55000, 80000, 75000]
}

df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)

'''
输出: 
     Name  Age  Salary
0   Alice   25   50000
1     Bob   30   60000
2  Charlie   35   55000
3   David   40   80000
4     Eve   28   75000
'''

示例 1:按 Age 列升序排序

df_sorted = df.sort_values(by='Age', ascending=True)
print("\n按 Age 升序排序:")
print(df_sorted)

输出:

     Name  Age  Salary
0   Alice   25   50000
4     Eve   28   75000
1     Bob   30   60000
2  Charlie   35   55000
3   David   40   80000

2. 分组

df.groupby

df.groupby(by, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, dropna=True)  # 对数据进行分组

groupby 允许我们根据某些列的值对数据进行分组,然后对每个组进行聚合操作(如求平均值、求和等)。可以对分组后的数据执行多种统计操作,非常灵活。

代码示例

假设有一个名为 df 的 DataFrame,包含员工的部门和薪水信息,想要按部门计算薪水的平均值:

import pandas as pd

# 创建示例 DataFrame
data = {
    'Department': ['HR', 'Engineering', 'Engineering', 'HR', 'Sales'],
    'Salary': [50000, 70000, 75000, 52000, 60000]
}

df = pd.DataFrame(data)

# 按部门进行分组,并计算薪水的平均值
grouped = df.groupby('Department')['Salary'].mean()

print(grouped)

输出:

Department
Engineering    72500.0
HR             51000.0
Sales          60000.0
Name: Salary, dtype: float64

在这个示例中,我们使用 groupbyDepartment 列进行分组,并计算每个部门的平均薪水。

3. 合并数据

pd.concat

pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)

使用示例:按行合并 DataFrame

import pandas as pd

# 创建示例 DataFrame
data1 = {
    'Name': ['Alice', 'Bob'],
    'Age': [25, 30]
}
data2 = {
    'Name': ['Charlie', 'David'],
    'Age': [35, 40]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

# 合并两个 DataFrame(按行合并)
result = pd.concat([df1, df2], ignore_index=True)

print(result)

输出:

      Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35
3    David   40

在此示例中,df1df2 被按行合并,且重置了索引。

pd.merge

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

使用示例:SQL风格的合并

import pandas as pd

# 创建示例 DataFrame
data1 = {
    'ID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie']
}
data2 = {
    'ID': [2, 3, 4],
    'Salary': [50000, 60000, 70000]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

# 按 'ID' 列合并两个 DataFrame(内连接)
result = pd.merge(df1, df2, on='ID', how='inner')

print(result)

输出:

   ID     Name  Salary
0   2      Bob   50000
1   3  Charlie   60000

在这个例子中,df1df2 按照 ID 列进行 SQL 风格的合并,只保留在两个 DataFrame 中都存在的 ID 值。

4. 应用函数

series.apply

Series.apply(func, convert_dtype=True, args=(), **kwds)

使用示例:将Age列的值乘以 2

import pandas as pd

# 创建示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Weight': [55, 65, 75]
}
df = pd.DataFrame(data)

# 使用 apply 将 Age 列的每个元素乘以 2
df['Age_doubled'] = df['Age'].apply(lambda x: x * 2)

print(df)

输出:

      Name  Age  Weight  Age_doubled
0    Alice   25      55          50
1      Bob   30      65          60
2  Charlie   35      75          70

在这个例子中,我们使用 applyAge 列的每个元素应用了 lambda x: x * 2 的函数,使得每个 Age 值都被乘以了 2。

df.apply

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

使用示例:按行计算Age和Weight的乘积

import pandas as pd

# 创建示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Weight': [55, 65, 75]
}
df = pd.DataFrame(data)

# 使用 apply 对每行进行计算,得到 Age 和 Weight 的乘积
df['Age_Weight'] = df.apply(lambda row: row['Age'] * row['Weight'], axis=1)

print(df)

输出:

      Name  Age  Weight  Age_Weight
0    Alice   25      55        1375
1      Bob   30      65        1950
2  Charlie   35      75        2625

在这个例子中,我们使用 apply 对每一行应用了 lambda row: row['Age'] * row['Weight'] 的函数,使得每行的 AgeWeight 列的乘积被计算并添加为新的一列 Age_Weight

2.5 时间序列处理

Pandas对时间序列数据有出色的支持:

# 创建时间序列
date_rng = pd.date_range(start='1/1/2020', end='1/08/2020', freq='D')

# 设置索引为日期
df.set_index('date_column', inplace=True)

# 重采样
df.resample('M').mean()

2.6 数据可视化

Pandas集成了Matplotlib,可以轻松绘制图表:

# 线图
df.plot()

# 柱状图
df.plot.bar()

# 直方图
df['Age'].plot.hist()

# 箱线图
df.plot.box()

2.7 性能优化技巧

  1. 使用适当的数据类型(如category类型用于分类变量)
  2. 避免循环,使用向量化操作
  3. 使用query()方法进行高效查询
  4. 对于大型数据集,考虑使用Dask或Modin等扩展库

三、代码示例

示例1:销售数据分析

# 读取销售数据
sales = pd.read_csv('sales_data.csv')

# 计算每月销售额
sales['date'] = pd.to_datetime(sales['date'])
monthly_sales = sales.resample('M', on='date')['amount'].sum()

# 可视化
monthly_sales.plot(title='Monthly Sales')

示例2:客户细分

# 创建RFM指标
snapshot_date = max(df['InvoiceDate']) + pd.Timedelta(days=1)
rfm = df.groupby('CustomerID').agg({
    'InvoiceDate': lambda x: (snapshot_date - x.max()).days,
    'InvoiceNo': 'count',
    'TotalPrice': 'sum'
})

# 重命名列
rfm.rename(columns={
    'InvoiceDate': 'Recency',
    'InvoiceNo': 'Frequency',
    'TotalPrice': 'MonetaryValue'
}, inplace=True)

以上就是Python数据处理工具之Pandas的使用详细指南的详细内容,更多关于Python Pandas数据处理的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文