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

如何基于Numpy数组从DataFrame的groupby中提取指定DTY值的行?

问题:从Climate_DF中筛选指定DTY值的行并保留特定列

我想要从Climate_DF数据框中提取所有年份里,DTY列值匹配Numpy数组DTY_Array中7个值的行,且仅保留'Precip9am'至'Wind ms 21 hr'的列。我先通过指定日期生成了正确的DTY_Array:

#Enter Day of Interest (DOI) yyyy, mm, dd
DOI = datetime.datetime(2020, 2, 6)
DTY = DOI.timetuple()[7]
DTYMinus3 = DTY-3
DTYPlus3 = DTY+3
DTY_Array = np.linspace(DTYMinus3, DTYPlus3,7)
DTY_Array = np.array(DTY_Array)

随后尝试按DTY分组后筛选:

ClimateDTY_DF = Climate_DF.groupby("DTY")
DTY_Climate = ClimateDTY_DF[DTY_Array]

但出现KeyError错误:KeyError: 'Columns not found: 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0'。我推测错误原因是当前筛选逻辑在查找列而非DTY列的值,请问正确的实现方法是什么?是否需要转置或循环处理?


正确实现方法

你说的没错,groupby("DTY")之后用[DTY_Array]是在尝试查找名称为这些数值的列,而非筛选DTY分组的键值,这就是报错的根源。完全不需要转置或者循环,用pandas的布尔索引+列切片就能轻松搞定,有两种写法:

写法一:简洁版(适用于目标列连续的情况)

如果'Precip9am'到'Wind ms 21 hr'在Climate_DF中是连续排列的列,直接一行代码就能完成:

# 同时筛选行和列
DTY_Climate = Climate_DF.loc[Climate_DF['DTY'].isin(DTY_Array), 'Precip9am':'Wind ms 21 hr']

写法二:通用版(适用于目标列不连续的情况)

如果目标列不连续,或者你需要明确控制列的范围,可以先获取列的位置索引再筛选:

# 生成行筛选的布尔掩码
row_mask = Climate_DF['DTY'].isin(DTY_Array)

# 获取目标列的索引范围
start_idx = Climate_DF.columns.get_loc('Precip9am')
end_idx = Climate_DF.columns.get_loc('Wind ms 21 hr') + 1  # 切片左闭右开,所以+1
target_columns = Climate_DF.columns[start_idx:end_idx]

# 组合筛选结果
DTY_Climate = Climate_DF.loc[row_mask, target_columns]

关键说明

  • isin(DTY_Array):用来检查DTY列的每个值是否在目标数组中,生成一个布尔数组作为行筛选的掩码
  • loc[row_mask, target_columns]:pandas的loc方法可以同时指定行筛选条件和列选择,是处理这类需求的标准方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:15:31