在我正在编写的脚本中,我希望经常重复同一段代码,其中我用一个groupby创建一个“分子”数据帧,然后用另一个groupby创建一个“分母”数据帧。然后我把两者合并在一起,这样分子和分母在一个地方。我正在尝试创建一个函数,我只需要传递给它的是我想要包含在分子和分母中的字段列表。在
函数如下:
def calcfractions(self, df, numlist, denomlist):
print("test 1")
numlist.append(denomlist)
selectlist = numlist
selectlist.append("TeamID")
selectlist.append("PlayerID")
print("test 2")
numdf = df[selectlist].groupby(numlist).agg({"PlayerID": "count"})
denomdf = df[selectlist].groupby(denomlist).agg({"PlayerID": "count"})
print("test 3")
mergeddf = pd.merge(numdf, denomdf, on=denomlist)
print("test 4")
return mergeddf
下面是我尝试使用它的脚本:
^{pr2}$但是,当我运行这个程序时,我只能在def calcfractions中打印“test 2”,在这之后有些东西会失败。我认为这可能与试图将denomlist附加到numlist有关。有什么想法吗?在
编辑:脚本不会“失败”,没有错误。就这样结束了。在
因此,在用伪造的值伪造我自己的数据帧并尝试解决这些问题之后,我发现我遇到了一个
ValueError: setting an array element with a sequence
。这是因为您将一个列表附加到一个列表中,并试图将其用作df中的列索引:试试这个:
^{pr2}${cd2>的某个地方提供了一个完整的子句?在任何情况下,如果这不能解决您的问题,请提供您的数据帧的一个小版本。在
编辑:来自docs on exceptions:“最后一个except子句可以省略异常名,作为通配符。使用时要格外小心,因为这样很容易掩盖真正的编程错误!”在
当然,看看链接的文档,但这里是直接问题的要点。这样写try/except子句被认为是不好的做法:
因为
except:
除了所有类型的Exceptions
。为了模仿引用的文献,这看起来好像没有错误。此外,正如这个问题的例子,这使得我们不可能知道到底是什么导致了错误(如果你甚至设法发现了一个错误)。在几乎所有情况下,您都应该对代码可能引发的错误有一个预期,因此try/except应该如下所示:如果出于某种疯狂的原因,必须执行通配符失败的 类型的消息。在
except:
,那么最好进行重构,这样就没有必要了,但至少,print()
某种指示^{一般来说,为了避免这个问题(因为它涉及到通配符或甚至是特定的异常),尽最大努力确保try/except子句只包含完成目标所需的代码。
您没有从
calcfractions
捕获返回值。在team_pr
中,更改为merged_df = self.calcfractions(df1, numlist, denomlist)
,然后print(merged_df.head(2))
以查看您得到的结果。在这是假设这些是类的方法。如果它们只是函数,只需去掉整个
self
位,它只用于类的语法,将实例作为第一个参数传入。在相关问题 更多 >
编程相关推荐