美文网首页
Pandas vs SQL

Pandas vs SQL

作者: 逍遥_yjz | 来源:发表于2022-03-31 11:25 被阅读0次

    Pandas 和 SQL 有很多相似之处,都是对二维表的数据进行查询、处理,都是数据分析中常用的工具。

    对于只会 Pandas 或只会 SQL 的朋友,可以通过今天例子快速学会另一个。

    1. 数据查询

    首先,读取数据

    import pandas as pd
    import numpy as np
    
    tips = pd.read_csv('tips.csv')
    
    1.1 查询列

    查询 total_billtip 两列

    tips[["total_bill", "tip"]]
    

    用 SQL 实现:

    select total_bill, tip
    from tips;
    
    1.2 增加列

    查询结果中,新增一列tip_rate

    tips['tip_rate'] = tips["tip"] / tips["total_bill"]
    

    用 SQL 实现:

    select *, tip/total_bill as tip_rate
    from tips;
    
    1.3 筛选条件

    查询 time列等于Dinner并且tip列大于5的数据

    tips[(tips["time"] == "Dinner") & (tips["tip"] > 5.00)]
    

    用 SQL 实现:

    select *
    from tips
    where time = 'Dinner' and tip > 5.00;
    

    2. 分组聚合

    按照某列分组计数

    tips.groupby("sex").size()
    
    '''
    sex
    Female     87
    Male      157
    dtype: int64
    '''
    

    用 SQL 实现:

    select sex, count(*)
    from tips
    group by sex;
    

    按照多列聚合多个值

    tips.groupby(["smoker", "day"]).agg({"tip": [np.size, np.mean]})
    

    用 SQL 实现:

    select smoker, day, count(*), avg(tip)
    from tips
    group by smoker, day;
    

    3. join

    构造两个临时DataFrame

    df1 = pd.DataFrame({"key": ["A", "B", "C", "D"], "value": np.random.randn(4)})
    df2 = pd.DataFrame({"key": ["B", "D", "D", "E"], "value": np.random.randn(4)})
    

    先用 Pandas 分别实现inner joinleft joinright joinfull join

    # inner join
    pd.merge(df1, df2, on="key")
    
    # left join
    pd.merge(df1, df2, on="key", how="left")
    
    # inner join
    pd.merge(df1, df2, on="key", how="right")
    
    # inner join
    pd.merge(df1, df2, on="key", how="outer")
    

    用 SQL 分别实现:

    # inner join
    select *
    from df1 inner join df2
    on df1.key = df2.key;
    
    # left join
    select *
    from df1 left join df2
    on df1.key = df2.key;
    
    # right join
    select *
    from df1 right join df2
    on df1.key = df2.key;
    
    # full join
    select *
    from df1 full join df2
    on df1.key = df2.key;
    

    4. union

    将两个表纵向堆叠

    pd.concat([df1, df2])
    

    用 SQL 实现:

    select *
    from df1
    
    union all
    
    SELECT *
    from df2;
    

    将两个表纵向堆叠并去重

    pd.concat([df1, df2]).drop_duplicates()
    

    用 SQL 实现:

    select *
    from df1
    
    union
    
    SELECT *
    from df2;
    

    5. 开窗

    tipsday列取值相同的记录按照total_bill排序。

    (tips.assign(
            rn=tips.sort_values(["total_bill"], ascending=False)
            .groupby(["day"])
            .cumcount()
            + 1
        )
        .sort_values(["day", "rn"])
    )
    

    用 SQL 实现:

    select
        *,
        row_number() over(partition by day order by total_bill desc) as rn
    from tips t
    

    day列取值相同的记录会被划分到同一个窗口内,并按照total_bill排序,窗口之间的数据互不影响,这类操作便被称为开窗

    相关文章

      网友评论

          本文标题:Pandas vs SQL

          本文链接:https://www.haomeiwen.com/subject/sragjrtx.html