You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅对Pandas分组中指定ID列表内的组进行插值填充?

问题描述

现有如下Pandas数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({'ID':[1, 1, 1, 2, 2, 2, 3, 3, 3],
                   'Value' : [np.nan, 5, np.nan, 7, np.nan, 9, 1, 3, np.nan]})

数据展示:

ID  Value
0   1    NaN
1   1    5.0
2   1    NaN
3   2    7.0
4   2    NaN
5   2    9.0
6   3    1.0
7   3    3.0
8   3    NaN

原本可以通过以下代码对所有分组进行双向插值填充空缺值:

df.groupby('ID').apply(lambda group: group.interpolate(limit_direction='both'))

但需求是仅对指定列表int_IDs = [1, 3]内的ID分组进行插值填充,其他ID分组保持原数据不变,预期输出:

ID  Value
0   1    5.0
1   1    5.0
2   1    5.0
3   2    7.0
4   2    NaN
5   2    9.0
6   3    1.0
7   3    3.0
8   3    3.0

尝试在lambda中添加条件判断时出现ValueError: The truth value of a DataFrame is ambiguous.错误,错误代码:

df.groupby('ID').apply(lambda group: group.interpolate(limit_direction='both') if group in int_IDs else group)
错误原因

报错的核心是group in int_IDs的判断逻辑错误:group是分组后的DataFrame对象,直接用整个DataFrame和列表中的整数比较,Pandas无法确定整个DataFrame的布尔值,因此抛出歧义错误。

解决方案

方法一:利用分组名称判断

分组后的group.name就是当前分组的ID值(整数类型),可以直接和int_IDs中的元素比较,修改后的代码如下:

int_IDs = [1, 3]
result = df.groupby('ID').apply(lambda group: group.interpolate(limit_direction='both') if group.name in int_IDs else group)
print(result)

该方法直接在groupby.apply中完成条件判断,逻辑简洁。

方法二:拆分处理后合并

如果数据量较大,拆分处理目标分组和非目标分组再合并的方式效率更高:

int_IDs = [1, 3]
# 处理需要插值的分组
processed_groups = df[df['ID'].isin(int_IDs)].groupby('ID').apply(lambda x: x.interpolate(limit_direction='both'))
# 保留不需要处理的原始数据
unprocessed_groups = df[~df['ID'].isin(int_IDs)]
# 合并数据并按原索引排序
result = pd.concat([processed_groups, unprocessed_groups]).sort_index()
print(result)

这种方式减少了不必要的分组遍历,适合大规模数据集。

内容的提问来源于stack exchange,提问作者Emi OB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:15:32