gspread按列名而非索引获取Google Sheet指定列方法咨询
实现按列名提取Google Sheet指定列的方案
你可以通过两种方式实现需求,第一种基于现有代码直接调整,第二种可以封装成你期望的自定义调用方法。
方法1:基于现有pandas逻辑直接过滤
你当前的代码已经将表格数据转换为带表头的DataFrame,只需要在生成df后直接提取指定列即可,这是最简单的实现方式:
ss = gs.open(args['name']) wks = ss.worksheet(args['worksheet']) data = wks.get_all_values() headers = data.pop(0) df = pd.DataFrame(data, columns=headers) # 直接按列名提取需要的列 target_df = df[['COLUMN1', 'COLUMN2']]
如果不需要保留完整的全量DataFrame,也可以在生成df时就指定需要的列,减少内存占用:
need_cols = ['COLUMN1', 'COLUMN2'] ss = gs.open(args['name']) wks = ss.worksheet(args['worksheet']) data = wks.get_all_values() headers = data.pop(0) df = pd.DataFrame(data, columns=headers)[need_cols]
方法2:封装自定义get_columns方法
如果你想要实现和wks.get_columns(['COLUMN1','COLUMN2'])完全一致的调用效果,可以给gspread的Worksheet类扩展一个自定义方法:
# 自定义按列名提取数据的方法 def get_columns(self, col_names): all_data = self.get_all_values() headers = all_data.pop(0) # 校验请求的列名是否存在 for col in col_names: if col not in headers: raise ValueError(f"列名 {col} 不存在于当前工作表") # 获取目标列的索引 col_indexes = [headers.index(col) for col in col_names] # 遍历每行提取对应列的值 result = [] for row in all_data: result.append([row[i] for i in col_indexes]) # 返回结果默认带表头,不需要可以去掉 [col_names] + 部分 return [col_names] + result # 将方法绑定到gspread的Worksheet类 gs.Worksheet.get_columns = get_columns
绑定完成后就可以直接使用你期望的语法调用:
ss = gs.open(args['name']) wks = ss.worksheet(args['worksheet']) # 直接获取指定列的内容,返回的二维数组第一行为表头,后续为对应行数据 col_data = wks.get_columns(['COLUMN1','COLUMN2']) # 也可以直接转换为DataFrame使用 df = pd.DataFrame(col_data[1:], columns=col_data[0])
内容的提问来源于stack exchange,提问作者Renan Nogueira
相关产品推荐
相关产品推荐

