我想将多列的多个函数应用于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)
但是我怀疑有更好的方法,比如:
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.
我确实找到了这个问题和答案,但解决方案看起来相当丑陋,考虑到答案已接近四年,现在可能有更好的方法.
我感到困惑的区别是什么之间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)
这里x1和x2它们不同,但是在一个不那么简单的计算中,result也是一个Delayed对象列表,使用client.persist(result)开始计算就像client.compute(result)那样.
我为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?
我想将两个色图合并为一个,这样我可以使用一个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)
我绘制pos与gist_heat_r和neg带binary.
我想有一个单一的颜色条与合并cmap的,所以这对我来说不是正确的方法.
那么,我如何将两个现有cmaps的合并为一个呢?
编辑:我承认,这是重复的,但给出的答案在这里更清楚.示例图像也使其更清晰.
我有一个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) 我想使用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) 我有自己的三角剖分算法,该算法基于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.points和delaunay.simplices,构成了三角剖分。我自己的三角剖分得到的信息完全相同,但是scipy.interpolate.LinearNDInterpolator需要一个scipy.spatial.Delaunay对象。
我想我需要继承scipy.spatial.Delaunay并实现相关方法。但是,我不知道要到达那里需要哪些。
我正在尝试捕获ProcessPoolExecutor.
想象你有一个文件func.py:
print("imported") # I do not want this print in subprocesses\n\ndef f(x):\n return x\nRun Code Online (Sandbox Code Playgroud)\n然后你用ProcessPoolExecutor类似的方式运行该函数
\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()\nRun Code Online (Sandbox Code Playgroud)\n现在我可以使用例如捕获第一次导入的输出contextlib.redirect_stdout,但是,我也想捕获子进程的所有输出并将它们重定向到主进程的标准输出。
在我的实际用例中,我收到了想要捕获的警告,但简单的打印就重现了该问题。
\npython ×7
dataframe ×2
pandas ×2
dask ×1
functools ×1
group-by ×1
ipython ×1
jupyter ×1
lambda ×1
matplotlib ×1
numpy ×1
process-pool ×1
scipy ×1
subprocess ×1