如何将逐行计算得到的多个结果存储到不同的新列中?
按行根据类型生成统计新列
Python(Pandas)实现
可以通过逐行处理或批量计算两种方式实现,批量计算更适合大数据量场景。
方法1:逐行处理(代码直观,小数据量适用)
import pandas as pd import numpy as np # 构造示例输入表 inputTable = pd.DataFrame({ 'type': ['a', 'b', 'a', 'b'], 'col1': [10, 20, 5, 15], 'col2': [8, 25, 3, 18], 'col3': [12, 15, 7, 22] }) def calculate_row(row): cols = [row['col1'], row['col2'], row['col3']] if row['type'] == 'a': return pd.Series([min(cols), max(cols)], index=['newCol1', 'newCol2']) elif row['type'] == 'b': return pd.Series([np.mean(cols), np.std(cols, ddof=0)], index=['newCol1', 'newCol2']) # 合并新列到原表 outputTable = pd.concat([inputTable, inputTable.apply(calculate_row, axis=1)], axis=1)
方法2:批量计算(效率更高,大数据量推荐)
利用numpy条件判断结合行级统计函数,避免逐行循环:
import pandas as pd import numpy as np inputTable = pd.DataFrame({ 'type': ['a', 'b', 'a', 'b'], 'col1': [10, 20, 5, 15], 'col2': [8, 25, 3, 18], 'col3': [12, 15, 7, 22] }) # 预计算所有行的统计值 row_mins = inputTable[['col1','col2','col3']].min(axis=1) row_maxs = inputTable[['col1','col2','col3']].max(axis=1) row_means = inputTable[['col1','col2','col3']].mean(axis=1) row_stds = inputTable[['col1','col2','col3']].std(axis=1, ddof=0) # 根据type选择对应值填充新列 outputTable = inputTable.copy() outputTable['newCol1'] = np.where(outputTable['type'] == 'a', row_mins, row_means) outputTable['newCol2'] = np.where(outputTable['type'] == 'a', row_maxs, row_stds)
SQL实现
以MySQL为例,利用CASE WHEN语句结合行级统计函数实现:
SELECT type, col1, col2, col3, CASE WHEN type = 'a' THEN LEAST(col1, col2, col3) WHEN type = 'b' THEN (col1 + col2 + col3)/3 END AS newCol1, CASE WHEN type = 'a' THEN GREATEST(col1, col2, col3) WHEN type = 'b' THEN STDDEV_POP(col1, col2, col3) END AS newCol2 FROM inputTable
- PostgreSQL可将标准差函数替换为
STDDEV(col1, col2, col3); - SQL Server计算行级最小值可嵌套
MIN子查询,标准差用STDEV(col1, col2, col3)。
内容的提问来源于stack exchange,提问作者winnie
相关产品推荐
相关产品推荐

