小编joh*_*tis的帖子

pandas,将多列的多个函数应用于groupby对象

我想将多列的多个函数应用于groupby对象,从而产生一个新的pandas.DataFrame.

我知道如何以单独的步骤做到这一点:

by_user = lasts.groupby('user')
elapsed_days = by_user.apply(lambda x: (x.elapsed_time * x.num_cores).sum() / 86400)
running_days = by_user.apply(lambda x: (x.running_time * x.num_cores).sum() / 86400)
user_df = elapsed_days.to_frame('elapsed_days').join(running_days.to_frame('running_days'))
Run Code Online (Sandbox Code Playgroud)

结果user_df是: user_df

但是我怀疑有更好的方法,比如:

by_user.agg({'elapsed_days': lambda x: (x.elapsed_time * x.num_cores).sum() / 86400, 
             'running_days': lambda x: (x.running_time * x.num_cores).sum() / 86400})
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为AFAIK agg()可以工作pandas.Series.

我确实找到了这个问题和答案,但解决方案看起来相当丑陋,考虑到答案已接近四年,现在可能有更好的方法.

python group-by dataframe pandas

13
推荐指数
2
解决办法
4504
查看次数

dask:client.persist和client.compute之间的区别

我感到困惑的区别是什么之间client.persist()client.compute()双方似乎(在某些情况下),开始我的计算,都返回异步对象,但不是在我的简单的例子:

在这个例子中

from dask.distributed import Client
from dask import delayed
client = Client()

def f(*args):
    return args

result = [delayed(f(x)) for x in range(1000)]

x1 = client.compute(result)
x2 = client.persist(result)
Run Code Online (Sandbox Code Playgroud)

这里x1x2它们不同,但是在一个不那么简单的计算中,result也是一个Delayed对象列表,使用client.persist(result)开始计算就像client.compute(result)那样.

python dask

9
推荐指数
1
解决办法
5348
查看次数

将Python 3内核的IPython 3更改为集群的python2

我为Python 3安装了IPython 3,以便与Jupyterhub一起使用.

现在我可以使用带有Python2内核的笔记本,因为我创建了 /usr/local/share/jupyter/kernels/python2/kernel.json

有:

{
 "argv": ["python2", "-m", "IPython.kernel",
          "-f", "{connection_file}"],
 "display_name": "Python 2",
 "language": "python2"
}
Run Code Online (Sandbox Code Playgroud)

现在我也想使用IPython.parallel,但是当我启动一个集群时它将自动启动Python 3中的引擎,我该如何将其更改为Python 2?

python ipython ipython-notebook ipython-parallel jupyter

6
推荐指数
1
解决办法
2313
查看次数

结合两个matplotlib色图

我想将两个色图合并为一个,这样我可以使用一个cmap用于负值,另一个用于正值.

目前我使用蒙版数组并使用一个图像cmap和另一个图像绘制另一个图像,从而产生:

在此输入图像描述

以下数据

dat = np.random.rand(10,10) * 2 - 1
pos = np.ma.masked_array(dat, dat<0)
neg = np.ma.masked_array(dat, dat>=0)
Run Code Online (Sandbox Code Playgroud)

我绘制posgist_heat_rnegbinary.

我想有一个单一的颜色条与合并cmap的,所以这对我来说不是正确的方法.

那么,我如何将两个现有cmaps的合并为一个呢?

编辑:我承认,这是重复的,但给出的答案在这里更清楚.示例图像也使其更清晰.

python matplotlib

6
推荐指数
1
解决办法
5848
查看次数

熊猫,将DataFrame转换为MultiIndex'ed DataFrame

我有一个pandas.DataFrame要转换为MultiIndexed的pandas.DataFrame

import numpy
import pandas
import itertools

xs = numpy.linspace(0, 10, 100)
ys = numpy.linspace(0, 0.1, 20)
zs = numpy.linspace(0, 5, 200)

def func(x, y, z):
    return x * y / z

vals = list(itertools.product(xs, ys, zs))
result = [func(x, y, z) for x, y, z in vals]

# Original DataFrame.
df = pandas.DataFrame(vals, columns=['x', 'y', 'z'])
df = pd.concat((pd.DataFrame(result, columns=['result']), df), axis=1)

# I want to turn `df` into this `df2`.
index = …
Run Code Online (Sandbox Code Playgroud)

python numpy multidimensional-array dataframe pandas

6
推荐指数
1
解决办法
4538
查看次数

使用functools.partial将其设置为值后,删除函数参数

我想使用functools.partial将某个参数设置为常量,同时完全删除该参数。

让我用一个简单的例子来解释它。

from functools import partial
def f(a, b):
    return a * b

g = partial(f, b=2)
Run Code Online (Sandbox Code Playgroud)

但是,此函数g仍然具有以下调用签名:

g?

Signature:      g(a, *, b=1)
Call signature: g(*args, **kwargs)
Type:           partial
String form:    functools.partial(<function f at 0x7ff7045289d8>, b=1)
File:           /opt/conda/envs/dev/lib/python3.6/functools.py
Docstring:     
partial(func, *args, **keywords) - new function with partial application
of the given arguments and keywords.
Run Code Online (Sandbox Code Playgroud)

我当然可以使用lambda函数来做到这一点,例如:

def f(a, b):
    return a * b

g = lambda a: f(a, b=2)
Run Code Online (Sandbox Code Playgroud)

具有正确的呼叫签名:

g?

Signature: g(a)
Docstring: <no docstring>
File: …
Run Code Online (Sandbox Code Playgroud)

python lambda function-signature functools

6
推荐指数
0
解决办法
322
查看次数

如何将scipy.interpolate.LinearNDInterpolator与自己的三角剖分一起使用

我有自己的三角剖分算法,该算法基于Delaunay的条件和渐变创建三角剖分,以使三角形与渐变对齐。

这是一个示例输出: 在此处输入图片说明

上面的描述与问题无关,但是对于上下文是必需的。

现在我想使用三角剖分与scipy.interpolate.LinearNDInterpolator进行插值。

使用scipy的Delaunay,我将执行以下操作

import numpy as np
import scipy.interpolate
import scipy.spatial
points = np.random.rand(100, 2)
values = np.random.rand(100)
delaunay = scipy.spatial.Delaunay(points)
ip = scipy.interpolate.LinearNDInterpolator(delaunay, values)
Run Code Online (Sandbox Code Playgroud)

delaunay对象具有delaunay.pointsdelaunay.simplices,构成了三角剖分。我自己的三角剖分得到的信息完全相同,但是scipy.interpolate.LinearNDInterpolator需要一个scipy.spatial.Delaunay对象。

我想我需要继承scipy.spatial.Delaunay并实现相关方法。但是,我不知道要到达那里需要哪些。

scipy scipy-spatial

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

捕获/重定向 ProcessPoolExecutor 的所有输出

我正在尝试捕获ProcessPoolExecutor.

\n

想象你有一个文件func.py

\n
print("imported")  # I do not want this print in subprocesses\n\ndef f(x):\n    return x\n
Run Code Online (Sandbox Code Playgroud)\n

然后你用ProcessPoolExecutor类似的方式运行该函数

\n
\nfrom concurrent.futures import ProcessPoolExecutor\nfrom func import f  # \xe2\x9a\xa0\xef\xb8\x8f the import will print! \xe2\x9a\xa0\xef\xb8\x8f\n\nif __name__ == "__main__":\n    with ProcessPoolExecutor() as ex:  # \xe2\x9a\xa0\xef\xb8\x8f the import will happen here again and print! \xe2\x9a\xa0\xef\xb8\x8f\n        futs = [ex.submit(f, i) for i in range(15)]\n        for fut in futs:\n            fut.result()\n
Run Code Online (Sandbox Code Playgroud)\n

现在我可以使用例如捕获第一次导入的输出contextlib.redirect_stdout,但是,我也想捕获子进程的所有输出并将它们重定向到主进程的标准输出。

\n

在我的实际用例中,我收到了想要捕获的警告,但简单的打印就重现了该问题。

\n

这与防止以下错误相关:https://github.com/Textualize/rich/issues/2371 …

python subprocess process-pool

5
推荐指数
0
解决办法
642
查看次数