多列取最大值或者最小值

/*

lvl1  lvl2   lvl3    lvl4    lvl

4      3     4      1       

3      2     2      1   

2      2     3      4

4      4     3      4

3      1     2      2

怎么写代码去比较lvl1lvl2lvl3lvl4 对应每行的值,取其中最小的,将其值添加到lvl列里

运行结果应该是

lvl

1

1

2

3

1

*/

-方法()函数法

-->Title:Generatingtest data

-->Author:wufeng4552

-->Date:2009-10-16 09:58:16

if not object_id('Tempdb..#t') is null
    drop table #t
Go
Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int)
Insert #t
select 4,3,4,1,null union all
select 3,2,2,1,null union all
select 2,2,3,4,null union all
select 4,4,3,4,null union all
select 3,1,2,2,null
Go
if object_id('UF_minget')is not null drop function UF_minget
go
create function UF_minget
(@col1 int,@col2 int,@col3 int,@col4 int)
returns int
as
  begin
     declare @t table(col int)
     insert @t select @col1 union all
               select@col2 union all
               select@col3 union all
               select@col4
     return(select min(col)from @t)
  end
go
update t set [lvl]=dbo.UF_minget([lvl1],[lvl2],[lvl3],[lvl4])
from #t t
select * from #t

--方法二 MSSQL2005 XML PATH

-------------------------------------

--  Author : liangCK 梁爱兰

--  Comment: 小梁兰儿

--  Date  : 2009-10-16 09:57:38

-------------------------------------

--> 生成测试数据: @T
DECLARE @T TABLE (lvl1 int,lvl2 int,lvl3 int,lvl4 int,lvl int)
INSERT INTO @T
SELECT 4,3,4,1,null UNION ALL
SELECT 3,2,2,1,null UNION ALL
SELECT 2,2,3,4,null UNION ALL
SELECT 4,4,3,4,null UNION ALL
SELECT 3,1,2,2,null
 
--SQL查询如下:
 
UPDATE A SET
    lvl = B.x.value('min(//row/*)','int')
FROM @T AS A
    CROSS APPLY(SELECT x =(SELECT A.* FOR XML PATH('row'),TYPE)) AS B;
   
SELECT * FROM @T;
 

--方法()作者 (四方城)

if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int)
insert [tb]
select 4,3,4,1,null union all
select 3,2,2,1,null union all
select 2,2,3,4,null union all
select 4,4,3,4,null union all
select 3,1,2,2,null
go
 
create function getmin(@a varchar(8000))  
  returns int  
  as  
  begin declare @ table (id int identity,a char(1))  
      declare @t int  
      insert @ select top 8000 null from sysobjects a,sysobjects b  
      select @t=min(cast(substring(','+@a,id+1,charindex(',',','+@a+',',id+1)-id-1) as int))  
      from @ where substring(','+@a,id,8000) like ',_%'  
      return @t  
  end  
go
 
-->查询
select
  lvl1,
  lvl2,
  lvl3,
  lvl4,
  lvl=dbo.getmin(ltrim(lvl1)+','+ltrim(lvl2)+','+ltrim(lvl3)+','+ltrim(lvl4))
from tb

--方法()(与方法三思路类似)

-->Title:Generatingtest data

-->Author:wufeng4552

-->Date:2009-10-16 09:58:16

if not object_id('Tempdb..#t') is null
    drop table #t
Go
Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int)
Insert #t
select 4,3,4,1,null union all
select 3,2,2,1,null union all
select 2,2,3,4,null union all
select 4,4,3,4,null union all
select 3,1,2,2,null
Go
 
if object_id('UF_minget')is not null drop function UF_minget
go
create function UF_minget
(@s varchar(200))
returns int
as
  begin
  return(
    select col=min(substring(@s,number,charindex(',',@s+',',number)-number))
    from master..spt_values
    where type='p' and number<=len(@s+'a') and charindex(',',','+@s,number)=number)
  end
go
select
  [lvl1],
  [lvl2],
  [lvl3],
  [lvl4],
  [lvl]=dbo.UF_minget(ltrim([lvl1])+','+ltrim([lvl2])+','+ltrim([lvl3])+','+ltrim([lvl4]))
from #T

--方法()(与方法一思路类似)

-->Title:Generatingtest data

-->Author:wufeng4552

-->Date:2009-10-16 09:58:16

if not object_id('Tempdb..#t') is null
    drop table #t
Go
Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int)
Insert #t
select 4,3,4,1,null union all
select 3,2,2,1,null union all
select 2,2,3,4,null union all
select 4,4,3,4,null union all
select 3,1,2,2,null
Go
select [lvl1],
       [lvl2],
       [lvl3],
       [lvl4],
       [lvl]=(select min([lvl1])
              from (select [lvl1]
                  unionall select [lvl2]
                  unionall select [lvl3]
                  unionall select [lvl4])T)
from #t
-- 方法六   两两比较
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int)
insert [tb]
select 4,3,4,1,null union all
select 3,2,2,1,null union all
select 2,2,3,4,null union all
select 4,4,3,4,null union all
select 3,1,2,2,null
go
 
-->函数:返回两个数中值较小的数
if object_id('F_GetMin')is not null drop function F_GetMin
go
CREATE FUNCTION F_GetMin
(  
  @arg1   AS   int,  
  @arg2   AS   int  
)  
RETURNS   int  
AS   
BEGIN  
  RETURN CASE  
           WHEN@arg1<=@arg2 THEN @arg1  
           WHEN@arg1>@arg2 THEN  @arg2  
           ELSE   NULL  
         END  
END  
GO  
 
-->查询
SELECT
  lvl1,
  lvl2,
  lvl3,
  lvl4,
  lvl=dbo.f_getmin(dbo.f_getmin(dbo.f_getmin(lvl1,lvl2),lvl3),lvl4) --函数嵌套
FROM  tb

from: http://bbs.youkuaiyun.com/topics/320098453

 

<think>我们使用pandas的DataFrame时,经常需要获某一列的最大值最小值。这可以通过`max()`和`min()`函数实现。 具体步骤: 1. 导入pandas库(如果还没有导入的话) 2. 读数据创建DataFrame 3. 选择要操作的列(可以是列名,也可以是列索引) 4. 对该列使用`max()`和`min()`函数 示例代码: ```python import pandas as pd # 创建示例DataFrame data = {'Name': ['Tom', 'Jerry', 'Mickey', 'Donald'], 'Age': [25, 30, 18, 22], 'Salary': [5000, 7000, 3000, 6000]} df = pd.DataFrame(data) # 获'Age'列的最大值最小值 max_age = df['Age'].max() min_age = df['Age'].min() print(f"最大年龄: {max_age}, 最小年龄: {min_age}") # 获'Salary'列的最大值最小值 max_salary = df['Salary'].max() min_salary = df['Salary'].min() print(f"最高工资: {max_salary}, 最低工资: {min_salary}") ``` 输出: ``` 最大年龄: 30, 最小年龄: 18 最高工资: 7000, 最低工资: 3000 ``` 注意: - 如果列中包含非数类型(如字符串),则`max()`和`min()`会返回按字典序的最大值最小值(对于字符串)报错(如果类型不支持比较)。因此,确保操作的是数列,或者至少是可比较的类型。 - 也可以使用`agg`函数同时获多个统计量: ```python age_stats = df['Age'].agg(['max', 'min']) print(age_stats) ``` 输出: ``` max 30 min 18 Name: Age, dtype: int64 ``` 另外,如果我们需要同时获多列的最大最小值,可以这样: ```python # 同时获多列的最大最小值 stats = df[['Age', 'Salary']].agg(['max', 'min']) print(stats) ``` 输出: ``` Age Salary max 30 7000 min 18 3000 ``` 性能:`max()`和`min()`函数都是向量化操作,对于大型数据集也非常高效。 如果列中包含缺失(NaN),那么默认情况下,`max()`和`min()`会忽略NaN。如果希望包括NaN(即如果存在NaN则结果可能为NaN),可以使用`skipna=False`参数,但通常我们不需要这样做。 例如: ```python # 假设有一行Age为NaN df_with_nan = df.copy() df_with_nan.loc[4] = ['Daisy', None, 5500] # 默认忽略NaN max_age_ignore_nan = df_with_nan['Age'].max() # 30 min_age_ignore_nan = df_with_nan['Age'].min() # 18 # 不忽略NaN max_age_with_nan = df_with_nan['Age'].max(skipna=False) # NaN min_age_with_nan = df_with_nan['Age'].min(skipna=False) # NaN ``` 因此,在处理有缺失的数据时,要注意是否要忽略缺失。 总结: 获DataFrame某列的最大值最小值,使用`df['列名'].max()`和`df['列名'].min()`即可。 相关问题: 1. 如何获DataFrame某列的最大值所在的行? 2. 如何同时获多列最大值最小值? 3. 如何获整个DataFrame的最大值最小值(不考虑列)? 4. 当列中有缺失时,如何控制是否忽略缺失?</think># 使用 Pandas 获 DataFrame 某列的最大值最小值 在 Pandas 中,获 DataFrame 某列的最大值最小值是常见的数据分析操作。以下是多种实现方法: ## 基本方法 ### 1. 使用 `max()` 和 `min()` 方法 ```python import pandas as pd # 创建示例 DataFrame data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Age': [25, 32, 18, 47], 'Salary': [50000, 72000, 38000, 95000]} df = pd.DataFrame(data) # 获 'Age' 列的最大值最小值 max_age = df['Age'].max() min_age = df['Age'].min() print(f"最大年龄: {max_age}, 最小年龄: {min_age}") ``` ### 2. 使用 `agg()` 方法同时获 ```python # 同时获最大最小值 age_stats = df['Age'].agg(['max', 'min']) print(age_stats) # 输出: # max 47 # min 18 # Name: Age, dtype: int64 ``` ## 高级用法 ### 3. 获最大值/最小值所在的行 ```python # 获年龄最大的行 max_age_row = df.loc[df['Age'].idxmax()] print("年龄最大的员工信息:") print(max_age_row) # 获年龄最小的行 min_age_row = df.loc[df['Age'].idxmin()] print("\n年龄最小的员工信息:") print(min_age_row) ``` ### 4. 处理缺失 当列中包含 NaN 时: ```python # 添加缺失 df.loc[4] = ['Eva', None, 62000] # 默认忽略 NaN max_age = df['Age'].max() # 47 min_age = df['Age'].min() # 18 # 包含 NaN 计算 max_age_with_nan = df['Age'].max(skipna=False) # NaN ``` ### 5. 多列同时计算 ```python # 同时计算多列的最大最小值 stats = df[['Age', 'Salary']].agg(['max', 'min']) print(stats) # 输出: # Age Salary # max 47 95000 # min 18 38000 ``` ## 性能优化 对于大型 DataFrame,使用 `numpy` 可提升性能: ```python import numpy as np # 转换为 NumPy 数组计算 ages = df['Age'].to_numpy() max_age = np.max(ages) min_age = np.min(ages) ``` ## 数学表达 设 DataFrame 的列为向量 $\vec{a} = (a_1, a_2, \dots, a_n)$,则最大值最小值分别为: $$\max(\vec{a}) = \max\{a_i | i = 1, 2, \dots, n\}$$ $$\min(\vec{a}) = \min\{a_i | i = 1, 2, \dots, n\}$$ 当存在缺失时,计算需考虑处理策略: $$\max(\vec{a}) = \begin{cases} \max\{a_i | a_i \neq \text{NaN}\} & \text{skipna=True} \\ \text{NaN} & \text{skipna=False} \end{cases}$$ ## 总结 | 方法 | 适用场景 | 优点 | |------|----------|------| | `df['col'].max()/min()` | 单列简单查询 | 简洁直接 | | `df['col'].agg(['max','min'])` | 同时获多个统计量 | 高效 | | `df.loc[df['col'].idxmax()]` | 需要整行信息 | 获完整记录 | | NumPy 方法 | 大型数据集 | 性能优化 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值