Pandas python:根据定义的列列表创建合并两个数据帧的函数

2024-05-16 17:43:23 发布

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

在我正在编写的脚本中,我希望经常重复同一段代码,其中我用一个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有关。有什么想法吗?在

编辑:脚本不会“失败”,没有错误。就这样结束了。在


Tags: 数据函数test脚本dfdef分子print
2条回答

因此,在用伪造的值伪造我自己的数据帧并尝试解决这些问题之后,我发现我遇到了一个ValueError: setting an array element with a sequence。这是因为您将一个列表附加到一个列表中,并试图将其用作df中的列索引:

numlist = ['PlayerLevel']
denomList = ['TeamName', 'Year']
numlist.append(denomlist) # as you suspected this is problematic:

print(numlist)
['PlayerLevel', ['TeamName', 'Year']]

试试这个:

^{pr2}$

{cd2>的某个地方提供了一个完整的子句?在任何情况下,如果这不能解决您的问题,请提供您的数据帧的一个小版本。在


编辑:来自docs on exceptions:“最后一个except子句可以省略异常名,作为通配符。使用时要格外小心,因为这样很容易掩盖真正的编程错误!”在

当然,看看链接的文档,但这里是直接问题的要点。这样写try/except子句被认为是不好的做法:

try:
    # do stuff
except:
    # do different/more stuff if original stuff fails

因为except:除了所有类型的Exceptions。为了模仿引用的文献,这看起来好像没有错误。此外,正如这个问题的例子,这使得我们不可能知道到底是什么导致了错误(如果你甚至设法发现了一个错误)。在几乎所有情况下,您都应该对代码可能引发的错误有一个预期,因此try/except应该如下所示:

try:
    # do stuff here
except ValueError: # or whatever type of child of Exception()
    # do different/more stuff if original stuff fails

如果出于某种疯狂的原因,必须执行通配符except:,那么最好进行重构,这样就没有必要了,但至少,print()某种指示^{失败的类型的消息。在

一般来说,为了避免这个问题(因为它涉及到通配符或甚至是特定的异常),尽最大努力确保try/except子句只包含完成目标所需的代码。

您没有从calcfractions捕获返回值。在team_pr中,更改为merged_df = self.calcfractions(df1, numlist, denomlist),然后print(merged_df.head(2))以查看您得到的结果。在

这是假设这些是类的方法。如果它们只是函数,只需去掉整个self位,它只用于类的语法,将实例作为第一个参数传入。在

相关问题 更多 >