如何对含重复Timestamp的数值列求均值并保留非数值列首个值?
解决DataFrame分组聚合的混合需求:数值列求均值+非数值列留首值
问题背景
原始数据:
| Timestamp | A | B | C |
|---|---|---|---|
| 19:26:01 | 27 | 55.2 | Earth |
| 19:26:01 | 20 | 54.5 | Jupiter |
| 19:26:02 | 20 | 56.2 | Mars |
| 19:26:02 | 24 | 53.6 | Venus |
想要得到的结果:
| Timestamp | A | B | C |
|---|---|---|---|
| 19:26:01 | 23.5 | 54.85 | Earth |
| 19:26:02 | 22 | 54.9 | Mars |
使用df.groupby('Timestamp', as_index=False).mean()时触发警告:
FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
核心需求:按Timestamp分组后,仅对数值列(A、B)求均值,同时保留非数值列(C)每组的第一个值。
三种可行方案
方案1:用agg统一指定列规则
直接通过聚合函数agg为不同类型的列设置处理逻辑,一步到位:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'Timestamp': ['19:26:01', '19:26:01', '19:26:02', '19:26:02'], 'A': [27, 20, 20, 24], 'B': [55.2, 54.5, 56.2, 53.6], 'C': ['Earth', 'Jupiter', 'Mars', 'Venus'] }) # 生成聚合规则:数值列求均值,非数值列取第一个值 agg_rules = {} for col in df.columns: if col == 'Timestamp': continue if df[col].dtype in ['int64', 'float64']: agg_rules[col] = 'mean' else: agg_rules[col] = 'first' # 分组聚合得到结果 result = df.groupby('Timestamp', as_index=False).agg(agg_rules) print(result)
方案2:拆分处理再合并
把数值列和非数值列分开处理,最后合并结果,逻辑更清晰:
# 1. 处理数值列:分组求均值 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns numeric_result = df.groupby('Timestamp', as_index=False)[numeric_cols].mean() # 2. 处理非数值列:分组取第一个值 non_numeric_cols = df.select_dtypes(exclude=['int64', 'float64']).columns non_numeric_result = df.groupby('Timestamp', as_index=False)[non_numeric_cols].first() # 3. 合并两个结果 result = pd.merge(numeric_result, non_numeric_result, on='Timestamp') print(result)
方案3:先处理数值列再补非数值列
先解决mean的警告问题,再手动补充非数值列的首值:
# 先对数值列求均值,指定numeric_only=True消除警告 numeric_mean = df.groupby('Timestamp', as_index=False).mean(numeric_only=True) # 获取非数值列的首值,去掉重复的数值列 non_numeric_first = df.groupby('Timestamp', as_index=False).first(numeric_only=False) non_numeric_first = non_numeric_first.drop(columns=numeric_mean.columns[1:]) # 合并结果 result = pd.merge(numeric_mean, non_numeric_first, on='Timestamp') print(result)
内容的提问来源于stack exchange,提问作者Krishna Chaitanya Vaddepally
相关产品推荐
相关产品推荐

