小编Pie*_*esi的帖子

将Pandas DataFrame切片到新的DataFrame中

我想用一个布尔索引切片一个DataFrame获取一个副本,然后独立于原始DataFrame在该副本上做东西.

从这个答案来看,.loc使用布尔数组进行选择会将一份副本交给我,但是,如果我尝试更改副本,则会SettingWithCopyWarning妨碍我.这会是正确的方式:

import numpy as np
import pandas as pd
d1 = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
# create a new dataframe from the sliced copy
d2 = pd.DataFrame(d1.loc[d1.a > 1, :])
# do stuff with d2, keep d1 unchanged
Run Code Online (Sandbox Code Playgroud)

python copy slice pandas

10
推荐指数
1
解决办法
6064
查看次数

为什么在元类派生自 ABCMeta 的类中需要使用@abstractmethod?

PEP 3119指出:

所述@abstractmethod装饰应仅在类体中使用,并且仅用于一个其元类是(衍生自)ABCMeta。不支持将抽象方法动态添加到类,或在方法或类创建后尝试修改其抽象状态。

然而,我找不到解释为什么会这样。具体来说,仅@abstractmethod在未显式继承自ABCMeta. 在下面的简单例子中,如果我理解正确,正确的做事方法是:

import six
from abc import ABCMeta
from abc import abstractmethod

class Base(six.with_metaclass(ABCMeta)):
    def __init__(self):
        print('Init abstract base')

    @abstractmethod
    def do_something(self):
        pass

class Subclass(Base):
    def __init__(self):
        super(Subclass, self).__init__()

    def do_something(self):
        print('Done.')

sub = Subclass()
sub.do_something()
Run Code Online (Sandbox Code Playgroud)

但是,如果我让Base类简单地从 继承object,并且仅在需要时使用装饰器,我会注意到行为没有变化。

from abc import abstractmethod

class Base(object):
    def __init__(self):
        print('Init abstract base')

    @abstractmethod
    def do_something(self):
        pass

class Subclass(Base):
    def __init__(self):
        super(Subclass, self).__init__()

    def do_something(self):
        print('Done.')

sub = …
Run Code Online (Sandbox Code Playgroud)

python inheritance abstract-class abc python-decorators

8
推荐指数
1
解决办法
2138
查看次数

使用NumPyDoc样式的带有Napoleon Sphinx扩展的类方法列表

我正在使用NumPyDoc样式的文档字符串来记录Python软件包。我想从'numpydoc'Sphinx扩展名切换到Napoleon,因为我发现它以更紧凑,更易读的方式格式化docstring。但是,它没有在文档顶部列出类的方法,我发现numpydoc具有非常有价值的功能。有谁知道如何在拿破仑手动将其打开?

python documentation numpydoc sphinx-napoleon

7
推荐指数
1
解决办法
302
查看次数

Python多处理模块中apply()和apply_async()之间的区别

我目前有一段代码产生多个进程,如下所示:

pool = Pool(processes=None)
results = [pool.apply(f, args=(arg1, arg2, arg3)) for arg3 in arg_list]
Run Code Online (Sandbox Code Playgroud)

我的想法是,这将使用之后可用的所有核心将工作划分为核心processes=None.但是,多处理模块docs中Pool.apply()方法的文档如下:

相当于apply()内置函数.它会一直阻塞,直到结果准备就绪,因此apply_async()更适合并行执行工作.此外,func仅在池中的一个工作程序中执行.

第一个问题: 我不清楚这一点.如何apply在工人之间分配工作,以及与什么方式不同apply_async?如果任务分布在工人之间,那怎么可能func只在其中一个工人中执行?

我的猜测:我的猜测是apply,在我当前的实现中,给一个具有一组参数的工作者提供一个任务,然后等待该工作完成,然后将下一组参数提供给另一个工作者.通过这种方式,我将工作发送到不同的流程,但没有发生并行性.这似乎是这种情况,因为apply事实上只是:

def apply(self, func, args=(), kwds={}):
    '''
    Equivalent of `func(*args, **kwds)`.
    Pool must be running.
    '''
    return self.apply_async(func, args, kwds).get()
Run Code Online (Sandbox Code Playgroud)

第二个问题:我也想更好地理解为什么在出台的文件,部分16.6.1.5.('使用工人池'),他们说,即使是apply_async像这样 的建筑[pool.apply_async(os.getpid, ()) for i in range(4)] 可能会使用更多的工艺,但它不确定它会.是什么决定是否使用多个流程?

python parallel-processing multiprocessing

5
推荐指数
1
解决办法
4630
查看次数