AI机器学习-Pandas

一、为什么使用 Pandas

在商业场景中,数据处理和分析是至关重要的环节。Pandas 作为 Python 中强大的数据处理库,能极大地提升工作效率,以下是几个主要原因:

1. 便捷的数据处理能力

在处理销售数据、客户信息等大量数据时,Pandas 提供了丰富的函数和方法,可以轻松完成数据清洗、筛选、转换等操作。例如,对销售数据进行去重、填充缺失值等操作。

2. 强大的数据结构

Pandas 提供了 Series 和 DataFrame 两种核心数据结构,能够很好地处理一维和二维数据,就像处理电子表格或数据库表一样方便。

3. 高效的文件读写

支持多种文件格式的读写,如 CSV、Excel、JSON、HDF5 等,方便与不同系统进行数据交互。在商业场景中,我们可能需要从不同来源获取数据,Pandas 可以帮助我们轻松处理这些数据。

4. 数据可视化支持

可以与 Matplotlib 等可视化库集成,方便进行数据可视化,直观地展示数据特征和趋势,为决策提供有力支持。

二、Pandas 数据类型

Pandas 是 Python 中用于数据处理和分析的强大库,它主要有两种基本数据类型:Series 和 DataFrame,以下将详细介绍这两种数据类型及其常用方法。

1. Series

1.1 介绍

Series 是一种一维带标签的数组,类似于一维数组或 Python 字典。它可以存储任何数据类型(如整数、浮点数、字符串等),并且每个数据点都有一个与之关联的标签(索引)。

1.2 创建

可以通过多种方式创建 Series,以下是几种常见的创建方式:

import pandas as pd
import numpy as np

# 从列表创建 Series
data_list = [10, 20, 30, 40]
index_list = ['a', 'b', 'c', 'd']
series_from_list = pd.Series(data_list, index=index_list)
print("从列表创建的 Series:")
print(series_from_list)

# 从字典创建 Series
data_dict = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
series_from_dict = pd.Series(data_dict)
print("\n从字典创建的 Series:")
print(series_from_dict)

# 从 NumPy 数组创建 Series
data_np = np.array([10, 20, 30, 40])
series_from_np = pd.Series(data_np, index=index_list)
print("\n从 NumPy 数组创建的 Series:")
print(series_from_np)
1.3 常用属性
  • index:获取 Series 的索引。
  • values:获取 Series 的值。
  • dtype:获取 Series 的数据类型。
print("\nSeries 的索引:", series_from_list.index)
print("Series 的值:", series_from_list.values)
print("Series 的数据类型:", series_from_list.dtype)
1.4 常用方法
  • head():返回 Series 的前几行,默认返回前 5 行。
  • tail():返回 Series 的后几行,默认返回后 5 行。
  • describe():生成 Series 的描述性统计信息,包括计数、均值、标准差等。
  • sort_values():按值对 Series 进行排序。
print("\nSeries 的前几行:")
print(series_from_list.head())

print("\nSeries 的后几行:")
print(series_from_list.tail())

print("\nSeries 的描述性统计信息:")
print(series_from_list.describe())

print("\n按值排序后的 Series:")
print(series_from_list.sort_values())

2. DataFrame

2.1 介绍

DataFrame 是一种二维带标签的数据结构,类似于电子表格或 SQL 表。它由多个 Series 组成,每个 Series 代表一列,并且可以有不同的数据类型。

2.2 创建

可以通过多种方式创建 DataFrame,以下是几种常见的创建方式:

import pandas as pd
import numpy as np

# 从字典列表创建 DataFrame
data_dict_list = [
    {'Name': 'Alice', 'Age': 25, 'City': 'New York'},
    {'Name': 'Bob', 'Age': 30, 'City': 'Los Angeles'},
    {'Name': 'Charlie', 'Age': 35, 'City': 'Chicago'}
]
df_from_dict_list = pd.DataFrame(data_dict_list)
print("\n从字典列表创建的 DataFrame:")
print(df_from_dict_list)

# 从字典创建 DataFrame,键为列名,值为列表
data_dict = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}
df_from_dict = pd.DataFrame(data_dict)
print("\n从字典创建的 DataFrame:")
print(df_from_dict)

# 从 Series 创建 DataFrame
name_series = pd.Series(['Alice', 'Bob', 'Charlie'])
age_series = pd.Series([25, 30, 35])
city_series = pd.Series(['New York', 'Los Angeles', 'Chicago'])
data = {
    'Name': name_series,
    'Age': age_series,
    'City': city_series
}
df_from_series = pd.DataFrame(data)
print("\n从 Series 创建的 DataFrame:")
print(df_from_series)
2.3 常用属性
  • index:获取 DataFrame 的行索引。
  • columns:获取 DataFrame 的列索引。
  • values:获取 DataFrame 的值,返回一个二维 NumPy 数组。
  • shape:返回 DataFrame 的行数和列数。
#跟在上面代码后面即可
print("\nDataFrame 的行索引:", df_from_dict.index)
print("DataFrame 的列索引:", df_from_dict.columns)
print("DataFrame 的值:")
print(df_from_dict.values)
print("DataFrame 的形状(行数,列数):", df_from_dict.shape)
2.4 常用方法
2.4.1 索引和选择数据
  • loc[]:通过标签索引选择数据。
  • iloc[]:通过整数位置索引选择数据。
  • []:通过列名选择列。
import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
#=================loc标签索引===============
# 选取单个元素
print("使用 loc 选取单个元素(行标签为 'b',列标签为 'Age'):")
print(df.loc['b', 'Age'])

# 选取多行多列
print("\n使用 loc 选取多行多列(行标签从 'b' 到 'd',列标签为 'Name' 和 'City'):")
print(df.loc['b':'d', ['Name', 'City']])

# 条件筛选
print("\n使用 loc 进行条件筛选(Age 大于 30 的行,所有列):")
print(df.loc[df['Age'] > 30, :])

#=================iloc整数位置索引===============
# 选取单个元素
print("使用 iloc 选取单个元素(第 1 行,第 1 列):")
print(df.iloc[1, 1])

# 选取多行多列
print("\n使用 iloc 选取多行多列(第 1 行到第 3 行,第 0 列和第 2 列):")
print(df.iloc[1:3, [0, 2]])

# 按照位置范围选取
print("\n使用 iloc 按照位置范围选取(前 2 行,所有列):")
print(df.iloc[:2, :])

#=================[]选择列索引===============
print(df['City'])
2.4.2 数据操作
  • drop():删除指定的行或列。
  • rename():重命名行索引或列索引。
  • sort_values():按指定列的值对 DataFrame 进行排序。
import pandas as pd

# 从字典创建 DataFrame,键为列名,值为列表
data_dict = {
    'Name': ['小花', '小雨', '小风'],
    'Age': [25, 30, 35],
    'City': ['北京', '天津', '上海']
}
df_from_dict = pd.DataFrame(data_dict)

# 删除第一行
df_dropped = df_from_dict.drop(0)
print("\n删除第一行后的 DataFrame:")
print(df_dropped)

# 重命名列名
df_renamed = df_from_dict.rename(columns={'Name': 'Full Name'})
print("\n重命名列名后的 DataFrame:")
print(df_renamed)

# 按 Age 列排序
df_sorted = df_from_dict.sort_values(by='Age')
print("\n按 Age 列排序后的 DataFrame:")
print(df_sorted)
2.4.3 数据统计
  • describe():生成 DataFrame 的描述性统计信息。
  • mean():计算每列的均值。
  • sum():计算每列的总和。
import pandas as pd

# 从字典创建 DataFrame,键为列名,值为列表
data_dict = {
    'price': [20, 30, 40],
    'Age': [25, 30, 35],
    'area': [100, 200, 300]
}
df_from_dict = pd.DataFrame(data_dict)

print("\nDataFrame 的描述性统计信息:")
print(df_from_dict.describe())

print("\n每列的均值:")
print(df_from_dict.mean())

print("\n每列的总和:")
print(df_from_dict.sum())
2.4.4 数据处理
  • fillna():填充缺失值。
  • dropna():删除包含缺失值的行或列。
import pandas as pd
import numpy as np

# 创建包含缺失值的 DataFrame
data_with_nan = {
    'Name': ['小美', '小亮', np.nan],
    'Age': [25, np.nan, 35],
    'City': ['北京', '天津', '上海']
}
df_with_nan = pd.DataFrame(data_with_nan)

# 填充缺失值
df_filled = df_with_nan.fillna('Unknown')
print("\n填充缺失值后的 DataFrame:")
print(df_filled)

# 删除包含缺失值的行
df_dropped_nan = df_with_nan.dropna()
print("\n删除包含缺失值的行后的 DataFrame:")
print(df_dropped_nan)
2.4.5 排序操作
  • sort_values(by=[],ascending=): 通过一个或者多个列值进行排序
import pandas as pd
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}
sales_df = pd.DataFrame(data)# 计算每个产品的销售总额(销售额 = 销售数量 * 价格)
# 按销售额降序排序
sorted_df = sales_df.sort_values(by='Sales', ascending=False)
print("按销售额降序排序后的 DataFrame:")
print(sorted_df)

三、DataFrame 运算

1. 算术运算

在计算销售总额、平均价格等指标时,需要进行算术运算。

import pandas as pd

# 创建一个销售数据的 DataFrame
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}

sales_df = pd.DataFrame(data)# 计算每个产品的销售总额(销售额 = 销售数量 * 价格)
sales_df['TotalSales'] = sales_df['Sales'] * sales_df['Price']
print("添加销售总额列后的 DataFrame:")
print(sales_df)

2. 逻辑运算

筛选出销售额大于 200 的产品。

#跟在上面代码后面即可
# 筛选销售额大于 200 的产品
filtered_df = sales_df[sales_df['Sales'] > 200]
print("销售额大于 200 的产品:")
print(filtered_df)

3. 统计运算

计算销售数据的统计指标,如平均值、最大值、最小值等。

#跟在上面代码后面即可
# 计算销售数据的统计指标
stats = sales_df[['Sales', 'Price', 'Profit']].describe()
print("销售数据的统计指标:")
print(stats)

4. 自定义运算

使用 apply 方法对数据进行自定义运算,例如计算每个产品的利润率。

#跟在上面代码后面即可
# 自定义函数计算利润率
def calculate_profit_margin(row):
    return row['Profit'] / (row['Sales'] * row['Price'])

sales_df['ProfitMargin'] = sales_df.apply(calculate_profit_margin, axis=1)
print("添加利润率列后的 DataFrame:")
print(sales_df)

四、Pandas 画图

在商业分析中,数据可视化可以帮助我们更直观地理解数据。Pandas 可以方便地与 Matplotlib 集成进行数据可视化。

想要修改图的类型直接修改kind即可,直接通过英文可选择图

import matplotlib.pyplot as plt
import pandas as pd

# 创建一个销售数据的 DataFrame
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}

sales_df = pd.DataFrame(data)
# 绘制销售数据的柱状图
sales_df.plot(x='Product', y='Sales', kind='bar', title='Product Sales')
plt.xlabel('Product')
plt.ylabel('Sales')
plt.show()

# 绘制利润率的折线图
sales_df.plot(x='Product', y='ProfitMargin', kind='line', title='Product Profit Margin')
plt.xlabel('Product')
plt.ylabel('Profit Margin')
plt.show()

五、文件读取与存储

在商业场景中,我们需要从不同的文件中读取数据,并将处理后的数据保存到文件中。

1. CSV 文件读写

import pandas as pd

# 创建一个销售数据的 DataFrame
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}

sales_df = pd.DataFrame(data)
# 保存 DataFrame 到 CSV 文件
sales_df.to_csv('sales_data.csv', index=False)

# 从 CSV 文件中读取数据
new_sales_df = pd.read_csv('sales_data.csv')
print("从 CSV 文件中读取的数据:")
print(new_sales_df)

2. Excel 文件读写

这里需要引入openpyxl依赖,否则报错:ModuleNotFoundError: No module named ‘openpyxl’

import openpyxl
import pandas as pd

# 创建一个销售数据的 DataFrame
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}

sales_df = pd.DataFrame(data)
# 保存 DataFrame 到 Excel 文件
sales_df.to_excel('sales_data.xlsx', index=False)

# 从 Excel 文件中读取数据
new_sales_df_excel = pd.read_excel('sales_data.xlsx')
print("从 Excel 文件中读取的数据:")
print(new_sales_df_excel)

六、高级处理

1. 缺失值处理

在实际数据中,经常会存在缺失值。Pandas 提供了多种方法来处理缺失值。

import pandas as pd
import numpy as np

# 创建包含缺失值的 DataFrame
data_with_nan = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, np.nan, 150, 300],
    'Price': [10, 20, np.nan, 30],
    'Profit': [20, 40, 30, np.nan]
}
nan_df = pd.DataFrame(data_with_nan)
print("包含缺失值的 DataFrame:")
print(nan_df)

# 删除包含缺失值的行
cleaned_df = nan_df.dropna()
print("删除缺失值后的 DataFrame:")
print(cleaned_df)

# 获取类型是数字的列
numeric_columns = nan_df.select_dtypes(include=[np.number]).columns
# 填充缺失值为平均值
filled_df = nan_df.fillna(nan_df[numeric_columns].mean())
print("填充缺失值后的 DataFrame:")
print(filled_df)

2. 数据离散化

在市场细分等场景中,我们可能需要将连续的数据离散化。

**什么是离散化:**连续属性的离散化就是在连续属性的值域上,将值域划分为若⼲个离散的区间,最后⽤不同的符号或整数 值代表落在每个⼦区间中的属性值。

**为什么要离散化:**数据离散化技术可以⽤来减少给定连 续属性值的个数

import pandas as pd

# 创建一个销售数据的 DataFrame
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}

sales_df = pd.DataFrame(data)
# 将销售数据进行离散化
bins = [0, 150, 250, 350]
labels = ['Low', 'Medium', 'High']
sales_df['SalesCategory'] = pd.cut(sales_df['Sales'], bins=bins, labels=labels)
print("添加销售类别列后的 DataFrame:")
print(sales_df)

3. 合并数据

在分析多个数据源时,需要将不同的 DataFrame 进行合并。

import pandas as pd

# 创建一个销售数据的 DataFrame
data = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Sales': [100, 200, 150, 300],
    'Price': [10, 20, 15, 30],
    'Profit': [20, 40, 30, 60]
}

sales_df = pd.DataFrame(data)
# 创建另一个 DataFrame
data2 = {
    'Product': ['ProductA', 'ProductB', 'ProductC', 'ProductD'],
    'Region': ['North', 'South', 'East', 'West']
}

region_df = pd.DataFrame(data2)

# 合并两个 DataFrame
merged_df = pd.merge(sales_df, region_df, on='Product')
print("合并后的 DataFrame:")
print(merged_df)

4. 分组与聚合

在分析不同颜色、价格的情况时,需要进行分组与聚合操作。

import pandas as pd

col = pd.DataFrame(
    {'color': ['white', 'red', 'green', 'red', 'green'],
     'object': ['pen', 'pencil', 'pencil', 'ashtray', 'pen'],
     'price1': [5.56, 4.20, 1.30, 0.56, 2.75],
     'price2': [4.75, 4.12, 1.60, 0.75, 3.15]})

print(col)
# 按颜色分组,计算每个price1的平均值
# 语法一
print(col.groupby(["color"])["price1"].mean())
# 语法二
print(col["price1"].groupby(col["color"]).mean())

# 计算分组有几种颜色
count = col.groupby(["color"]).count()
print(f"颜色种类是:{count}")

# 计算分组后各组price1和
sumPrice = col.groupby(["color"])["price1"].sum()
print(f"分组后各组price1和:{sumPrice}")

通过以上学习,可以掌握 Pandas的基本操作,在数据分析中灵活运用 Pandas 处理和分析数据

喜欢那就别犹豫啦,赶紧点赞👍 收藏🌟 加关注👀 吧!后续仍然会持续分享相关内容哦!!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐