我有一个DataFrame df,我已经用它了.我正在寻找一个类似于get_group(name)的函数,除了如果名称不存在而不是抛出KeyError,返回一个空的DataFrame(或其他一些值),类似于dict.get的工作方式:
g = df.groupby('x')
# doesn't work, but would be nice:
i = g.get_group(1, default=[])
# does work, but is hard to read:
i = g.obj.take(g.indices.get(1, []), g.axis)
Run Code Online (Sandbox Code Playgroud)
是否已有提供此功能的功能?
编辑:
在很多方面,GroupBy对象由一个dict(.indicies,.groups)表示,这个'get with default'功能足以构成一个dict的概念,它包含在Python语言本身中.似乎如果一个类似dict的东西没有默认的get,也许我不能正确理解它?为什么像这样的dict没有"默认获得"?
我想做的缩写示例是:
df1_bymid = df1.groupby('mid')
df2_bymid = df2.groupby('mid')
for mid in set(df1_bymid.groups) | set(df2_bymid.groups) :
rows1 = df1_bymid.get_group(mid, [])
rows2 = df1_bymid.get_group(mid, [])
for row1, row2 in itertools.product(rows1, rows2) :
yield row1, row2
Run Code Online (Sandbox Code Playgroud)
当然我可以创建一个函数,我可能,似乎如果我必须走得太远,也许我没有按照预期的方式使用GroupBy对象:
def get_group(df, name, obj=None, default=None) :
if obj is None :
obj = …Run Code Online (Sandbox Code Playgroud) 在Python中获取迭代器的最后N个元素的最佳方法是什么?以下是理论行动中的一个例子:
>>> list(all_but_the_last_n(range(10), 0))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(all_but_the_last_n(range(10), 2))
[0, 1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud) 我正在尝试不同的Theano模型,并使用不断增加的序列长度的课程.为了填充GPU的内存,我怎样才能提前预测任何给定序列长度和模型的批量大小有多大?
更糟糕的是,如果我不小心使用了太多内存,我会得到一个MemoryError并且GPU上的内存没有释放,要求我重新启动进程以释放内存,并在尝试新批量之前丢失网络.由于此错误无法恢复,因此很难在异常之前增加批量大小,然后再向下调整.
我们有一个庞大而复杂的功能,需要具有确定性.它是我们公司的主力之一,涵盖了大量的代码.由于python的dict迭代器,这段代码经常变得不确定.这已经发生了很多次,并且很难追踪,并且通常不会立即注意到.我们想编写一个自动测试来检测非确定性,但我不知道该怎么做.
我们已经尝试在循环中运行函数,并且测试结果总是相同的,但有时,即使函数是非确定性的,函数也会通过此测试,因为dict迭代器的任意但有些一致的排序.
有没有办法编写自动化测试来捕获这种bug?
也许有一种方法来破解python的dict,以便迭代器在这个测试中是随机的而不是随意的?那样重复调用函数会更容易发生分歧吗?这似乎是一个相当复杂的方法,但我想不出任何其他方式.
编辑:
我们目前正在使用Python 2.7.
我们对各个子模块进行了单元测试,但由于字典顺序的任意但一致的性质,它们通常不会暴露非确定性.
此外,也许非确定性不是描述这个问题的正确方法.这个函数接受{id:data},但是id的值不应该影响代码的结果,但是由于python dict的排序,它有时会这样做.也许测试这个的最好方法是用随机值替换id,并检查在使用不同id的多次运行后输出是否相同.