当我保存为时,我的函数定义会给出不同的结果工具.py金融机构

2024-04-27 00:51:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Jupiter实验室中编写了两个函数,当我将它们集成到一个tools.py文件并导入Jupiter实验室时,我得到了不同的结果。谁能告诉我有什么区别吗?你知道吗

实际上,这些函数是用来将一种嵌套数据帧转换为一种平面数据帧的。我觉得问题出在我以前用两个参数应用函数的方式上

这是我在jupyter实验室的代码:

def findTS(s):
    out=""
    for i,r in om.iterrows():
        sci=r["sec_ID"]
        if sci in s:
            out=r["type_sec"]

            exit
    return(out)
def Js2Geodf(df): 
# df=OmegaJ["chapters"][0]
    om=json_normalize(df,"section")
    om=om.dropna(subset=["sec_part"])
    l=[]
    for i,x in om.iterrows():
        k={"type_sec":x["type_sec"]}
        l.append([x["sec_part"]])
        listItems=list(flatten_list(l))
        dfout=pd.DataFrame(listItems)
        dfout["type_sec"]=dfout.apply(lambda x: findTS(x["ID"]),axis=1)
        return(dfout)

然后我以一种可以独立使用的方式将它们集成到模块tools.py

def findTS(s,df):
    out=""
    om=json_normalize(df,"section")
    for i,r in om.iterrows():
        sci=r["sec_ID"]
        if sci in s:
            out=r["type_sec"]

            exit
    return(out)
def Js2Geodf(df): 
# df=OmegaJ["chapters"][0]
    om=json_normalize(df,"section")
    om=om.dropna(subset=["sec_part"])
    l=[]
    for i,x in om.iterrows():
        k={"type_sec":x["type_sec"]}
        l.append([x["sec_part"]])
    listItems=list(flatten_list(l))
    dfout=pd.DataFrame(listItems)
    dfout["type_sec"]=dfout.apply(lambda x: findTS(x["ID"],df),axis=1)
    return(dfout)

正如您在每个函数中看到的,都有一些小的更改。你知道吗

在第一个函数中:

-def findTS(s)--->def findTS(s,df)
-adding ....om=json_normalize(df,"section")

在最后一行的第二个函数中:

-dfout["type_sec"]=dfout.apply(lambda x: findTS(x["ID"]),axis=1)-->
-dfout["type_sec"]=dfout.apply(lambda x: findTS(x["ID"],df),axis=1)

问题是它给了我不同的结果,我对apply和lambda的用法有点怀疑。你知道吗


Tags: lambda函数iniddffordeftype
1条回答
网友
1楼 · 发布于 2024-04-27 00:51:12

没有实际数据很难搞清楚,但有一件事可能是原因:

  1. 原始变型:

    • Js2Geodf公司:

      # ...
      om = json_normalize(df, "section")  # @TODO - cfati: MARKED LINE 1
      om = om.dropna(subset=["sec_part"])  # @TODO - cfati: MARKED LINE 2
      # ...
      
    • 发现:

      # ...
      for i, r in om.iterrows():
      # ...
      

    findTS中,对执行标记行2

    后产生的om变量(来自Js2Geodf)进行操作

  2. 修改的变体:

    • Js2Geodf公司:

      事情与#1完全相同。

    • 发现:

      # ...
      om = json_normalize(df, "section")  # @TODO - cfati: Identical to MARKED LINE 1
      for i, r in om.iterrows():
      # ...
      

    findTS中,您对这里定义的om变量进行操作,其定义与标记行1相同,因此:

    • 您丢失了标记线2
    • 每次调用findTS时执行这一行也是非常低效的

正如我在评论中所说的(当时我只看到一个设计缺陷,现在很明显这也是代码中的一个语义缺陷),传递om作为参数,而不是df
下面是代码(我也做了一些小的改进,还有很大的改进空间,但我没有遵循逻辑,所以我没有更改它):

def findTS(s, om):
    for i, r in om.iterrows():
        sci = r["sec_ID"]
        if sci in s:
            return r["type_sec"]
    return ""


def Js2Geodf(df): 
    #df = OmegaJ["chapters"][0]
    om = json_normalize(df, "section")
    om = om.dropna(subset=["sec_part"])
    l = []
    for i, x in om.iterrows():
        l.append([x["sec_part"]])
    listItems = list(flatten_list(l))
    dfout = pd.DataFrame(listItems)
    dfout["type_sec"] = dfout.apply(lambda x: findTS(x["ID"], om), axis=1)
    return dfout

@EDIT0

总结评论中的信息:

  • Js2Geodf的最后4行缩进在原始和修改的变体中是不同的(我假设这是前者的一个输入错误)
  • 确保输入数据在不同的运行(以及不同的代码版本)中保持不变。显然,这个问题产生了很多麻烦,一旦解决,代码也能正常工作

相关问题 更多 >