温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python中如何把excel文件读取为df并用SQL查询、分析

发布时间:2021-11-25 15:10:47 阅读:540 作者:小新 栏目:大数据
Python开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>
# Python中如何把Excel文件读取为DF并用SQL查询、分析

## 引言

在数据分析领域,Excel文件是最常见的数据源之一,而Python的pandas库和SQL查询的结合能够提供强大的数据处理能力。本文将详细介绍如何:
1. 使用pandas读取Excel文件为DataFrame
2. 通过SQL语法查询DataFrame数据
3. 进行复杂的数据分析操作

---

## 一、环境准备

### 1.1 安装必要库
```bash
pip install pandas openpyxl sqlalchemy
  • pandas: 数据处理核心库
  • openpyxl: 处理xlsx格式的Excel文件
  • sqlalchemy: 提供SQL查询接口

1.2 示例数据准备

创建示例Excel文件sales_data.xlsx,包含以下字段:

order_id product quantity unit_price order_date
1001 Laptop 2 1200 2023-01-15

二、读取Excel到DataFrame

2.1 基础读取方法

import pandas as pd

# 读取整个Excel文件
df = pd.read_excel('sales_data.xlsx', engine='openpyxl')

# 读取特定工作表
df = pd.read_excel('sales_data.xlsx', sheet_name='Sheet1')

2.2 高级参数配置

# 指定列数据类型
dtype = {'order_id': str, 'quantity': float}
df = pd.read_excel('sales_data.xlsx', dtype=dtype)

# 处理空值
df = pd.read_excel('sales_data.xlsx', na_values=['NA', 'NULL'])

三、使用SQL查询DataFrame

3.1 通过pandasql库

from pandasql import sqldf

# 基本查询
query = "SELECT product, SUM(quantity) as total_qty FROM df GROUP BY product"
result = sqldf(query, globals())

# 多表连接(需提前加载多个DF)
query = """
SELECT a.product, b.category 
FROM df a 
JOIN product_info b ON a.product = b.product_name
"""

3.2 通过SQLAlchemy(推荐生产环境使用)

from sqlalchemy import create_engine

# 创建内存数据库
engine = create_engine('sqlite:///:memory:')

# 将DataFrame存入临时表
df.to_sql('sales', engine, index=False)

# 执行SQL查询
query = """
SELECT strftime('%Y-%m', order_date) as month, 
       SUM(quantity * unit_price) as revenue
FROM sales 
GROUP BY month
"""
result = pd.read_sql(query, engine)

四、实战分析案例

4.1 销售趋势分析

query = """
SELECT 
    product,
    SUM(quantity) as total_units,
    SUM(quantity * unit_price) as total_revenue,
    AVG(unit_price) as avg_price
FROM sales
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY product
ORDER BY total_revenue DESC
"""

4.2 客户购买行为分析

query = """
WITH monthly_stats AS (
    SELECT 
        strftime('%Y-%m', order_date) as month,
        COUNT(DISTINCT order_id) as orders_count
    FROM sales
    GROUP BY month
)
SELECT 
    month,
    orders_count,
    LAG(orders_count, 1) OVER (ORDER BY month) as prev_month,
    (orders_count - LAG(orders_count, 1) OVER (ORDER BY month)) / 
        LAG(orders_count, 1) OVER (ORDER BY month) as growth_rate
FROM monthly_stats
"""

五、性能优化技巧

5.1 数据预处理优化

# 读取时只加载必要列
cols = ['product', 'quantity', 'order_date']
df = pd.read_excel('sales_data.xlsx', usecols=cols)

# 提前转换日期类型
df['order_date'] = pd.to_datetime(df['order_date'])

5.2 查询优化

# 创建数据库索引
with engine.connect() as conn:
    conn.execute("CREATE INDEX idx_product ON sales(product)")
    
# 使用CTE代替子查询
query = """
WITH high_value_orders AS (
    SELECT order_id 
    FROM sales 
    WHERE quantity * unit_price > 1000
)
SELECT * FROM sales WHERE order_id IN high_value_orders
"""

六、完整代码示例

import pandas as pd
from sqlalchemy import create_engine

# 读取数据
df = pd.read_excel('sales_data.xlsx', parse_dates=['order_date'])

# 创建SQL引擎
engine = create_engine('sqlite:///:memory:')
df.to_sql('sales', engine, index=False)

# 执行复杂分析
query = """
SELECT 
    product,
    SUM(quantity) as total_units,
    SUM(quantity * unit_price) as total_revenue,
    ROUND(SUM(quantity * unit_price) / SUM(quantity), 2) as effective_price
FROM sales
GROUP BY product
HAVING total_revenue > 5000
ORDER BY total_revenue DESC
"""

result = pd.read_sql(query, engine)
result.to_excel('analysis_result.xlsx', index=False)

结语

通过结合pandas的Excel处理能力和SQL的查询灵活性,我们可以: 1. 轻松处理百万行级别的Excel数据 2. 复用现有的SQL知识进行复杂分析 3. 输出结果到新的Excel文件或其他格式

这种工作流特别适合需要定期处理Excel报表的数据分析师,既保留了Excel的易用性,又获得了SQL的强大查询能力。 “`

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4848094/blog/4794802

AI

开发者交流群×