我在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的用法有点怀疑。你知道吗
没有实际数据很难搞清楚,但有一件事可能是原因:
原始变型:
Js2Geodf公司:
发现:
在findTS中,对执行标记行2
后产生的om变量(来自Js2Geodf)进行操作
修改的变体:
Js2Geodf公司:
事情与#1完全相同。
发现:
在findTS中,您对这里定义的om变量进行操作,其定义与标记行1相同,因此:
正如我在评论中所说的(当时我只看到一个设计缺陷,现在很明显这也是代码中的一个语义缺陷),传递om作为参数,而不是df。
下面是代码(我也做了一些小的改进,还有很大的改进空间,但我没有遵循逻辑,所以我没有更改它):
@EDIT0:
总结评论中的信息:
相关问题 更多 >
编程相关推荐