如何按ID聚合数据并保留非重复字段?(Reshape to wide without timevar)
按ID分组求和Sum字段的实现方法
以下是几种常用工具的实现方案,根据你的使用场景选择即可:
Python(Pandas)
两种写法都能实现需求,第一种更贴合"按id+相同字段分组"的逻辑,第二种适用于确认每个id对应a/b/c唯一的场景:
写法1:按id、a、b、c分组求和
import pandas as pd # 示例数据(实际可通过pd.read_csv等方式读取) data = { 'id': [1,1,1,2,2], 'a': ['state','state','state','county','county'], 'b': ['yes','yes','yes','no','no'], 'c': [1,1,1,4,4], 'sum': [0,234,45,456,55] } df = pd.DataFrame(data) # 分组聚合 result = df.groupby(['id', 'a', 'b', 'c'], as_index=False)['sum'].sum() print(result)
写法2:按id分组,保留a/b/c的首个值并求和sum
result = df.groupby('id').agg({ 'a': 'first', 'b': 'first', 'c': 'first', 'sum': 'sum' }).reset_index()
SQL
如果数据存储在数据库中,直接执行分组求和语句即可:
SELECT id, a, b, c, SUM(sum) AS sum FROM your_table GROUP BY id, a, b, c;
注:由于每个id对应的a/b/c值完全一致,部分数据库支持仅按id分组,但带上所有非聚合字段更符合SQL标准,兼容性更强。
R语言
使用dplyr包(推荐)
library(dplyr) # 示例数据 data <- data.frame( id = c(1,1,1,2,2), a = c('state','state','state','county','county'), b = c('yes','yes','yes','no','no'), c = c(1,1,1,4,4), sum = c(0,234,45,456,55) ) # 分组求和 result <- data %>% group_by(id, a, b, c) %>% summarise(sum = sum(sum), .groups = 'drop') print(result)
使用Base R的aggregate函数
result <- aggregate(sum ~ id + a + b + c, data = data, FUN = sum)
内容的提问来源于stack exchange,提问作者Rnovice
相关产品推荐
相关产品推荐

