Pandas和SQL行转列,pivot_sum(case…)

Pandas

在Pandas中,可以使用pivot方法将行转换为列,这通常被称为“透视”操作。以下是一个简单的例子来说明如何进行行转列:

假设我们有以下DataFrame:

import pandas as pd

# 创建一个示例DataFrame
df = pd.DataFrame({
    'Category': ['A', 'A', 'B', 'B'],
    'Year': [2020, 2021, 2020, 2021],
    'Value': [10, 15, 10, 20]
})

print(df)

输出:
Category Year Value
0 A 2020 10
1 A 2021 15
2 B 2020 10
3 B 2021 20

如果我们想要将年份从行转换为列,可以使用pivot方法:

# 使用pivot方法进行行转列
pivot_df = df.pivot(index='Category', columns='Year', values='Value')

print(pivot_df)

输出:
Year 2020 2021
Category
A 10 15
B 10 20

在这个例子中,index参数指定了哪一列作为新DataFrame的行索引,columns参数指定了哪一列的值将作为新DataFrame的列名,而values参数指定了哪一列的值将填充到新DataFrame中。
请注意,pivot方法要求索引/列名组合必须是唯一的,也就是说,每个Category和Year的组合必须是唯一的。如果不是这样,那么透视操作可能会因为不明确的映射而失败,或者它会将值合并(比如求和)。如果存在重复的索引/列名组合,并且你希望合并它们,可以使用pivot_table方法并指定聚合函数,例如:

# 使用pivot_table方法并指定聚合函数
pivot_table_df = df.pivot_table(index='Category', columns='Year', values='Value', aggfunc='sum')

print(pivot_table_df)

这将得到与pivot方法相同的结果,因为在这个例子中没有重复的组合。但是,如果存在重复的组合,pivot_table方法会应用指定的聚合函数(在这个例子中是求和)来合并值。

SQL

在SQL中,行转列通常涉及到使用CASE语句或者PIVOT操作。PIVOT操作是SQL Server中特有的一个功能,它可以将行数据转换为列数据。
我们将使用PIVOT操作将一个销售数据表中的年份从行转换为列。

假设我们有以下表格Sales:

CREATE TABLE Sales (
    SaleID int,
    Country varchar(50),
    Year int,
    Amount decimal(10, 2)
);

并且有以下数据:

INSERT INTO Sales (SaleID, Country, Year, Amount)
VALUES
(1, 'USA', 2020, 1000.00),
(2, 'USA', 2021, 1100.00),
(3, 'Canada', 2020, 750.00),
(4, 'Canada', 2021, 825.00);

现在我们想要将年份从行转换为列,以便我们可以看到每个国家每年的销售金额。我们可以使用PIVOT操作来实现这一点:

SELECT Country, [2020], [2021]
FROM (
    SELECT Country, Year, Amount
    FROM Sales
) AS SourceTable
PIVOT (
    SUM(Amount)
    FOR Year IN ([2020], [2021])
) AS PivotTable;

执行这个查询后,我们得到的结果将会是:
Country 2020 2021


USA 1000.00 1100.00
Canada 750.00 825.00

在这个例子中,我们首先选择了Country、Year和Amount字段,然后使用PIVOT操作将Year字段的值从行转换为列。SUM(Amount)是聚合函数,用于计算每个国家每年的销售总额。FOR Year指定了原始列名,而IN ([2020], [2021])指定了我们想要转换为列的年份。
如果你使用的数据库不支持PIVOT操作,你可以使用CASE语句来模拟这个操作:

SELECT
    Country,
    SUM(CASE WHEN Year = 2020 THEN Amount ELSE 0 END) AS [2020],
    SUM(CASE WHEN Year = 2021 THEN Amount ELSE 0 END) AS [2021]
FROM Sales
GROUP BY Country;

这个查询使用了CASE语句来为每个国家和每年的销售金额创建列,然后使用SUM函数来聚合每年的销售金额,并通过GROUP BY语句按国家分组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZeroSnowy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值