0

我已经定义了以下辅助方法

def load_excel(file_path: str, sheet_name: str = ''):
    if sheet_name == '':
        df = pd.read_excel(file_path).fillna('').apply(lambda x: x.astype(str).str.lower())
    else:
        df = pd.read_excel(file_path, sheet_name).fillna('').apply(lambda x: x.astype(str).str.lower())
        
    return df

def build_score_dict(keywords_df: pd.DataFrame, tokens: list):
    """
    Returns a tuple of two dictionories. i.e. tuple[dict, dict]
    """
    matched_keywords_by_cat_dict={}
    score_dict={}

    cnt_cols = keywords_df.shape[1]
    
    for col_idx in range(0, cnt_cols):
        keyword_list=list(keywords_df.iloc[:,col_idx])
        matched_keywords=[]
        parent_cat=0
        for j in range(0,len(tokens)):
            token = tokens[j]
            if token in keyword_list:
                parent_cat= parent_cat + 1
                matched_keywords.append(token)
                parent_cat_name = keywords_df.columns[col_idx]
                matched_keywords_by_cat_dict[parent_cat_name]=matched_keywords
                score_dict[parent_cat_name]=parent_cat
    
    return matched_keywords_by_cat_dict, score_dict

我的电话build_score_dict,如下图

third_level_closing=load_excel(input_dir+'third_level_keywords.xlsx',sheet_name='closing')     
_, level3_score_dict = build_score_dict(third_level_closing, tokens)

Pylance 在 VSCode 中给我以下警告/错误。这里发生了什么以及如何解决它?

Argument of type "Series[Dtype]" cannot be assigned to parameter "keywords_df" of type "DataFrame" in function "build_score_dict"
  "Series[Dtype]" is incompatible with "DataFrame"Pylance (reportGeneralTypeIssues)
4

1 回答 1

2

解决方法

如果您axis在调用apply它时给出一个值应该可以解决问题:

def load_excel(file_path: str, sheet_name: str = ''):
    if sheet_name == '':
        df = pd.read_excel(file_path).fillna('').apply(lambda x: x.astype(str).str.lower(), axis='index')
    else:
        df = pd.read_excel(file_path, sheet_name).fillna('').apply(lambda x: x.astype(str).str.lower(), axis='index')
        
    return df

解释

如果将类型信息添加到函数的返回值,load_excel您将看到类型检查器考虑dfaSeries而不是 a DataFrame

在此处输入图像描述

如果我们编写如下函数代码,我们可以很快发现该apply方法是问题的根源:

def load_excel(file_path: str, sheet_name: str = "") -> pd.DataFrame:
    if sheet_name == "":
        df: pd.DataFrame = pd.read_excel(file_path)
    else:
        df: pd.DataFrame = pd.read_excel(file_path, sheet_name)

    df = df.fillna("")
    df = df.apply(lambda x: x.astype(str).str.lower())

    return df

在此处输入图像描述

如果我们 ctrl-click on VSCode (on Windows)apply我们可以看到以下内容: 在此处输入图像描述

这表明,如果apply方法接收的唯一参数是f类型检查器,则无法说出apply您想要的方法版本。似乎 Pylance 实现适用于它找到的第一个定义,我猜这就是为什么你最终会返回apply假定为 a 的原因Series。当您添加axis参数时,类型检查器现在可以检查返回 a 的第二个定义DataFrame

于 2020-12-05T14:51:03.777 回答