小编sta*_*yra的帖子

使用一行来交换pandas数据框中所选行的列值的正确语法是什么?

我使用pandas版本0.14.1与Python 2.7.5,我有一个包含三列的数据框,例如:

import pandas as pd

d = {'L':  ['left', 'right', 'left', 'right', 'left', 'right'],
     'R': ['right', 'left', 'right', 'left', 'right', 'left'],
     'VALUE': [-1, 1, -1, 1, -1, 1]}
df = pd.DataFrame(d)

idx = (df['VALUE'] == 1)
Run Code Online (Sandbox Code Playgroud)

得到一个如下所示的数据框:

       L      R  VALUE
0   left  right     -1
1  right   left      1
2   left  right     -1
3  right   left      1
4   left  right     -1
5  right   left      1
Run Code Online (Sandbox Code Playgroud)

对于行VALUE == 1,我想交换左右列的内容,以便所有"左"值最终在"L"列下,"右"值最终在"R"下柱.

已经定义了idx上面的变量,通过使用临时变量,我可以在另外三行中轻松完成此操作,如下所示:

tmp = df.loc[idx,'L']
df.loc[idx,'L'] = …
Run Code Online (Sandbox Code Playgroud)

python pandas

18
推荐指数
3
解决办法
1万
查看次数

为什么通过共享内存进行通信比通过队列慢得多?

我在最近的老式Apple MacBook Pro上使用Python 2.7.5,它有四个硬件和八个逻辑CPU; 即,sysctl实用程序提供:

$ sysctl hw.physicalcpu
hw.physicalcpu: 4
$ sysctl hw.logicalcpu
hw.logicalcpu: 8
Run Code Online (Sandbox Code Playgroud)

我需要在大型1-D列表或数组上执行一些相当复杂的处理,然后将结果保存为中间输出,稍后将在我的应用程序的后续计算中再次使用.我的问题的结构很自然地适用于并行化,所以我认为我会尝试使用Python的多处理模块将1D阵列细分为几个部分(4件或8件,我还不确定哪个),执行并行计算,然后将结果输出重新组合成最终格式.我正在尝试决定是使用multiprocessing.Queue()(消息队列)还是multiprocessing.Array()(共享内存)作为我的首选机制,用于将子进程的结果计算传递回主父进程,我一直在尝试使用几个"玩具"模型,以确保我理解多处理模块实际上是如何工作的.然而,我遇到了一个相当意外的结果:在为同一个问题创建两个本质上等效的解决方案时,使用共享内存进行进程间通信的版本似乎比使用消息的版本需要更多的执行时间(比多30倍!)队列.下面,我为"玩具"问题提供了两个不同版本的示例源代码,它使用并行进程生成一长串随机数,并以两种不同的方式将聚集结果传回父进程:首先使用消息队列,第二次使用共享内存.

以下是使用消息队列的版本:

import random
import multiprocessing
import datetime

def genRandom(count, id, q):

    print("Now starting process {0}".format(id))
    output = []
    # Generate a list of random numbers, of length "count"
    for i in xrange(count):
        output.append(random.random())
    # Write the output to a queue, to be read by the calling process 
    q.put(output)

if __name__ == "__main__":
    # Number of random numbers to be generated …
Run Code Online (Sandbox Code Playgroud)

python performance message-queue shared-memory multiprocessing

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

正确使用scale_fill_manual()在ggplot2中创建多色直方图条?

我有一系列我想在R中探索的数据文件,为了这个问题的目的,我计划用它来生成一个带有我将标记的列变量的数据框foo.foo沿着区间[0,7000] 的谎言范围.作为我的数据探索练习的一部分,我想创建一个1D直方图foo,但有点扭曲:foo在(1000,7000)之间的范围内的值对我来说特别"有趣",因此我我希望使用颜色调色板对该数据范围内的单个直方图条进行颜色编码(即,因为稍后我最终打算重复使用相同的调色板来映射我暂时从数据框中省略的其他列的数据让我的问题变得不必要地变得复杂了.相反,foo[0,1000]范围内的值对我来说并不那么有趣,但是我仍然希望能够在直方图中看到它们,尽管是灰色的,在存在任何值的情况下.

在下面的代码示例中,我生成了一个人工样本数据框,并尝试使用ggplot2选择填充颜色来绘制直方图scale_fill_manual().我确实得到了一个多色的直方图,但它看起来并不像预期的那样:ggplot2似乎忽略了我在颜色之间放置断点的指示.具体来说,问题似乎与丢失的数据有关:碰巧没有数据的间隔似乎没有映射到颜色,尽管我的意图是它们应该是.这也意味着灰色最终会被映射到区间(1000,1500),而不是像我预期的那样被映射到[0,1000].

我的问题:如何强制ggplot2将特定颜色填充代码分配给特定数据范围,即使某些间隔为空并且没有数据,因此不会生成与这些间隔对应的直方图条?

我在下面包含了我的代码的初始版本,以及一个虚拟示例数据框以及它生成的输出的手工注释版本.

library(ggplot2)

# Minimum and maximum values of interest (for other data sets, additional
# values that are of lesser interest may fall within the interval [0, 1000])
lolim<-1000
hilim<-7000
bwdth<-500
# Construct sample data frame
df<-data.frame(foo=c(1200, 1300, 1750, 2200, 2300, 2750, 3200, 3300, 3750,
                     4200, 4300, 4750, 6200, 6300, 6750))
# Construct a discrete factor variable which can later …
Run Code Online (Sandbox Code Playgroud)

r ggplot2

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

如何从Docker容器内部访问OSX主机上的USB驱动器?

我有一个最终要在打包在docker映像中的云计算服务(例如AWSGoogle Cloud)上运行的应用程序。该应用程序需要在云中运行的原因是,该应用程序旨在处理大型数据文件,但是在实际部署之前,我想先在本地笔记本电脑上使用我已经使用过的单个大型数据文件对其进行测试。 (用于测试和开发目的)存储在外部USB驱动器上。

我的开发机器是一台OSX笔记本电脑,并且我正在使用最新版本的docker:

stachyra> uname -a
Darwin Andrews-MacBook-Pro-76.local 14.5.0 Darwin Kernel Version 14.5.0: Tue Sep  1 21:23:09 PDT 2015; root:xnu-2782.50.1~1/RELEASE_X86_64 x86_64
stachyra> docker --version
Docker version 1.10.2, build c3959b1
Run Code Online (Sandbox Code Playgroud)

OSX已将我的外部USB驱动器device挂载/dev/disk2s2/Volumes/MGR DATA

stachyra> df
Filesystem    512-blocks       Used Available Capacity   iused    ifree %iused  Mounted on
/dev/disk1     974770480  435721376 538537104    45%  54529170 67317138   45%   /
devfs                375        375         0   100%       650        0  100%   /dev
map -hosts             0          0         0   100%         0        0 …
Run Code Online (Sandbox Code Playgroud)

linux macos usb mount docker

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

如何使用 Docker Registry HTTP API V2 获取 Docker 注册表中所有存储库的列表?

与我合作的外部组织允许我访问私有(受身份验证令牌保护的)docker 注册表,最终我希望能够使用 docker 的 HTTP API V2 查询此注册表,以便获取所有注册表中可用的存储库和/或图像。

但在我这样做之前,我首先想获得一些在公共注册表(如Docker Hub )上构建这些类型的 API 查询的基本实践。因此,我继续在 Docker Hub 上使用用户名和密码注册了自己,并查阅了 API V2 文档,其中指出可以请求进行API 版本检查,如下所示:

GET /v2/
Run Code Online (Sandbox Code Playgroud)

或请求存储库列表为:

GET /v2/_catalog
Run Code Online (Sandbox Code Playgroud)

使用 curl 以及我用于注册 Docker Hub 帐户的用户名和密码,我尝试在命令行构造一个 GET 请求:

stachyra> curl -u stachyra:<my_password> -X GET https://index.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
stachyra> curl -u stachyra:<my_password> -X GET https://index.docker.io/v2/_catalog
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}
Run Code Online (Sandbox Code Playgroud)

当然,<my_password>我用我的实际帐户密码代替了 。

我一直期望从这个查询中得到的响应是一条巨大的 json 消息,列出了数千个存储库名称,但 API 似乎拒绝了我的 Docker Hub 凭据。

问题 1:我什至有index.docker.iodocker hub 注册表的正确 URL ( …

rest restful-authentication docker dockerhub docker-api

5
推荐指数
3
解决办法
6675
查看次数

如何让 argparse 识别跟随可变长度可选参数的位置参数?

我正在编写一个脚本,该脚本将用于合并多个输入文件,生成一个输出文件,并且我想使用argparse. 对我来说,最自然的方法是使用一个可选输入 ,-i它接受一个或多个输入文件名,后跟一个位置参数,表示输出文件名。这是我的想法的一个例子:

#!/usr/bin/env python3
"""
Script for merging input files
"""
import argparse

script_docstring = 'Read some input files and create a merged output.'
parser = argparse.ArgumentParser(description=script_docstring)
# Optional input file names
parser.add_argument('-i --inputs', nargs='+', type=str, required=True,
                    help='Input file names', dest='inputs')
# Positional output file name
parser.add_argument('fname_out', type=str, help='Output file name')
args = parser.parse_args()

# Display what the user chose at the command line
print(args.inputs)
print(args.fname_out)
Run Code Online (Sandbox Code Playgroud)

当我打印由 创建的自动生成的帮助消息时argparse,调用签名看起来就像我想要的那样:

> ./mergefiles.py --help
usage: mergefiles.py …
Run Code Online (Sandbox Code Playgroud)

python optional-parameters argparse positional-argument

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

为什么'键入d.keys()'在O(n)时完成,而'key in d'在O(1)中完成?

我对这个问题有一个后续问题.原始问题的一位评论者提到他过去曾经误认为人们使用如下语法:

key in d.keys()
Run Code Online (Sandbox Code Playgroud)

在O(n)时间内完成,而不是

key in d
Run Code Online (Sandbox Code Playgroud)

在O(1)时间内完成,没有意识到差异.直到今天(当我在试图理解为什么我的代码运行如此缓慢之后偶然发现原始问题时),我才是其中之一.我尝试使用Python 2.7.5验证注释的准确性,果然,这里是timeit的结果:

$ python -m timeit -s 'd=dict.fromkeys(range(100))' '1000 in d.keys()'
100000 loops, best of 3: 2.18 usec per loop
$ python -m timeit -s 'd=dict.fromkeys(range(100))' '1000 in d'
10000000 loops, best of 3: 0.0449 usec per loop
$ python -m timeit -s 'd=dict.fromkeys(range(1000))' '10000 in d.keys()'
100000 loops, best of 3: 17.9 usec per loop
$ python -m timeit -s 'd=dict.fromkeys(range(1000))' '10000 in d'
10000000 loops, best of 3: …
Run Code Online (Sandbox Code Playgroud)

python dictionary

2
推荐指数
1
解决办法
551
查看次数

为什么numpy.unique无法识别多个numpy.nan值相同?

我有一个简短的示例脚本:

import numpy as np

print('numpy version:       ', np.version.version)

foo = np.full(10, 5)
bar = np.full(10, np.nan)

print('foo:                 ', foo)
print('Unique values of foo:', np.unique(foo))

print('bar:                 ', bar)
print('Unique values of bar:', np.unique(bar))
Run Code Online (Sandbox Code Playgroud)

它显示以下结果:

numpy version:        1.16.4
foo:                  [5 5 5 5 5 5 5 5 5 5]
Unique values of foo: [5]
bar:                  [nan nan nan nan nan nan nan nan nan nan]
Unique values of bar: [nan nan nan nan nan nan nan nan nan nan]
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 当它接收输入时,为什么不只 …

python numpy

2
推荐指数
1
解决办法
77
查看次数