小编J J*_*nes的帖子

在Python中使用unittest进行相对导入

我正在尝试使用Python单元测试和相对导入,我似乎无法弄明白.我知道有很多相关的问题,但到目前为止他们都没有帮助.对不起,如果这是重复的,但我真的很感激任何帮助.我试图使用PEP 328 http://www.python.org/dev/peps/pep-0328/的语法,但我一定有错.

我的目录结构是:

project/
    __init__.py
    main_program.py
    lib/
        __init__.py
        lib_a
        lib_b
    tests/
        __init__.py
        test_a
        test_b
Run Code Online (Sandbox Code Playgroud)

我用以下方法运行测试:

python -m unittest test_module1 test_module2
Run Code Online (Sandbox Code Playgroud)

test_a需要导入lib/lib_a和main_program.这是我试图用于导入的test_a中的代码:

from ..lib import lib_a as lib
from ...project import main_program
Run Code Online (Sandbox Code Playgroud)

都引发了这个错误:

ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)

我的所有init .py文件当前都是空的.

任何具体的建议将不胜感激!!

编辑:

这可能是答案: Python包? 我还在核实这是否有效.

编辑二:

为了澄清,此时我试图以3种不同的方式运行我的测试文件:

project/tests $ python -m unittest test_a
project/tests $ python -m test_a
project/tests $ ./test_a
Run Code Online (Sandbox Code Playgroud)

所有三个都失败并出现与上述相同的错误.当我在项目目录中使用相同的三种语法时,我收到此错误:

ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)

再次感谢.

python python-import python-unittest

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

测试是否存在pandas DataFrame

在我的代码中,我有几个变量可以包含一个pandas DataFrame,或者根本没有.假设我想测试并查看是否已创建某个DataFrame.我的第一个想法是像这样测试它:

if df1:
    # do something
Run Code Online (Sandbox Code Playgroud)

但是,该代码以这种方式失败:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)

很公平.理想情况下,我希望有一个适用于DataFrame或Python None的状态测试.

这是一种可行的方法:

if not isinstance(df1, type(None)):
    # do something
Run Code Online (Sandbox Code Playgroud)

但是,测试类型真的很慢.

t = timeit.Timer('if None: pass')
t.timeit()
# approximately 0.04
t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
t.timeit()
# approximately 0.4
Run Code Online (Sandbox Code Playgroud)

哎哟.除了速度慢之外,对NoneType的测试也不是很灵活.

另一种解决方案是初始化df1为空DataFrame,以便在null和非null情况下类型都相同.然后我可以测试使用len(),或者any()类似的东西.但是,制作一个空的DataFrame似乎有些愚蠢和浪费.

另一种解决方案是使用指示符变量:在创建df1_exists之前设置为False df1.然后,df1我会测试,而不是测试df1_exists.但这似乎并不那么优雅.

是否有更好,更Pythonic的方式来处理这个问题?我错过了什么,或者这只是熊猫所有令人敬畏的事情的一个尴尬的副作用?

python dataframe pandas

30
推荐指数
2
解决办法
3万
查看次数

在pandas DataFrame中使用None而不是np.nan作为空值

我有一个混合数据类型的pandas DataFrame.我想用None替换所有空值(而不是默认的np.nan).出于某种原因,这似乎几乎是不可能的.

实际上我的数据框是从csv读入的,但这里有一个简单的DataFrame,它有混合数据类型来说明我的问题.

df = pd.DataFrame(index=[0], columns=range(5))
df.iloc[0] = [1, 'two', np.nan, 3, 4] 
Run Code Online (Sandbox Code Playgroud)

我做不到:

>>> df.fillna(None)
ValueError: must specify a fill method or value
Run Code Online (Sandbox Code Playgroud)

也不:

>>> df[df.isnull()] = None
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
Run Code Online (Sandbox Code Playgroud)

也不:

>>> df.replace(np.nan, None)
TypeError: cannot replace [nan] with method pad on a DataFrame
Run Code Online (Sandbox Code Playgroud)

我曾经有一个只有字符串值的DataFrame,所以我可以这样做:

>>> df[df == ""] = None
Run Code Online (Sandbox Code Playgroud)

哪个有效.但是现在我有混合数据类型,这是不行的.

由于我的代码的各种原因,能够使用None作为我的空值将是有帮助的.有没有办法可以将空值设置为None?或者我只需要返回我的其他代码并确保我在所有地方都使用np.isnan或pd.isnull?

python dataframe pandas

14
推荐指数
2
解决办法
9661
查看次数

使用字典更新pandas DataFrame行

我在pandas DataFrames中发现了一个我不明白的行为.

df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=['one', 'one', 'two'], columns=['col1', 'col2', 'col3'])
new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'})
df.iloc[0] = new_data
# resulting df looks like:

#       col1    col2    col3
#one    new     new     new
#one    9       6       1
#two    8       3       7
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试添加字典,我会得到这个:

new_data = {'col1': 'new', 'col2': 'new', 'col3': 'new'}
df.iloc[0] = new_data
#
#         col1  col2    col3
#one      col2  col3    col1
#one      2     1       7
#two      5     8       6
Run Code Online (Sandbox Code Playgroud)

为什么会这样?在写这个问题的过程中,我意识到df.loc很可能只是从new_data中获取密钥,这也解释了为什么值不正常.但是,再次,为什么会这样呢?如果我尝试从字典创建一个DataFrame,它会像处理列一样处理键:

pd.DataFrame([new_data])

#    col1   col2 …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

Pandas:使用“列表中的项目”语法进行布尔索引

假设我有一个 DataFrame,其中有一列名为 col1。如果我想获得 col1 == 'a' 的所有行,我可以这样做:

df[df.col1 == ‘a’]
Run Code Online (Sandbox Code Playgroud)

如果我想要 col1 为“a”或“b”的行,我可以这样做:

df[(df.col1 == ‘a’) | (df.col1 == ‘b’)]
Run Code Online (Sandbox Code Playgroud)

但我真的很想做这样的事情(在语法上是非法的):

df[df.col1 in [‘a’, ‘b’, ‘c’]]
Run Code Online (Sandbox Code Playgroud)

有没有合适的熊猫方法来做到这一点?

这是我正在使用的:

sort_func = lambda x: x in [‘a’, ‘b’, ‘c’]
mask = df[‘col1’].apply(sort_func)
df[mask]
Run Code Online (Sandbox Code Playgroud)

但是……有没有更好的方法来做到这一点?这让我很困扰。

python pandas

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

Anaconda Python 3.6-pythonw和python应该等效吗?

根据Python 3文档,从3.6版本开始,运行GUI脚本的python和pythonw应该等效

使用旧版本的Python,您需要注意一个Mac OS X的怪癖:与Aqua窗口管理器对话的程序(换句话说,任何具有GUI的程序)都需要以特殊的方式运行。使用pythonw而不是python启动此类脚本。

使用Python 3.6时,可以使用python或pythonw。

但是,我刚刚使用Python 3.6安装了Anaconda,并且如果我尝试使用python(而不是pythonw)运行wxPython GUI,仍然会收到非框架构建错误:

This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么此错误仍然存​​在?

我使用的Python版本是:

Python 3.6.0 :: Anaconda 4.3.1 (x86_64)
Run Code Online (Sandbox Code Playgroud)

python anaconda python-3.6

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

sys.path与$ PATH

我想从python程序中访问$ PATH变量.到目前为止我的理解是sys.path给出了Python模块的搜索路径,但我想要的是$ PATH环境变量.有没有办法从Python中访问它?

为了给出更多背景知识,我最终想要做的是找出用户安装了Package_X /的位置,这样我就可以在Package_X /中找到html文件的绝对路径.如果这是一个不好的做法,或者有更好的方法来实现这一点,我将不胜感激任何建议.谢谢!

python filesystems bash sys

5
推荐指数
2
解决办法
854
查看次数

brew-installed Python不会覆盖系统python

我刚刚使用brew在OS X上安装Python 3.该python3命令现在使用brew Python 3.6启动解释器,但python仍然使用默认系统Python 2.7打开解释器.

我的理解是,默认情况下,brew Python现在应该覆盖系统Python.(即,在$ PATH中查看/ usr/bin和/ usr/local/bin的顺序等).在我的PATH中,/ usr/local/bin位于/ usr/bin之前,因此它不应该是PATH问题.我试过重启终端,没有任何效果.

如果相关,这是我的完整PATH.

/Users/**/.rvm/gems/ruby-1.9.3-p362/bin:/Users/**/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/**/.rvm/rubies/ruby-1.9.3-p362/bin:/Users/**/.rvm/bin:/Users/**/.rvm/bin:/Users/**/Python/PmagPy/programs/conversion_scripts2/:/Users/**/Python/PmagPy/programs/conversion_scripts/:/Users/**/Python/PmagPy/programs:/usr/local/heroku/bin:./bin:/usr/local/sbin:/usr/local/bin:/usr/local/share/npm/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin
Run Code Online (Sandbox Code Playgroud)

为什么brew不优先使用?我该如何修复(或排除故障)?如果我找不到另一个选项,我可以创建一个别名,但我更愿意了解正在发生的事情并找到问题的根源.

更新:

我检查了"可能重复"的问题,但我的问题似乎不是一个链接问题:

 ~ brew link --overwrite --dry-run python
Warning: Already linked: /usr/local/Cellar/python/3.6.4_4
To relink: brew unlink python && brew link python
 ~ 
Run Code Online (Sandbox Code Playgroud)

python macos homebrew path

5
推荐指数
2
解决办法
2818
查看次数

matlab语法"'"

我正在尝试将一些matlab代码转换为Python.我有MATLAB几乎没有任何经验,但我只需要借用一个小功能.我被困在这一部分:

在该示例中,V是3×3矩阵.

A = V(:,3)  % i.e. A = [1 2 3]
par = [-(A(2:3))'/A(1)]
Run Code Online (Sandbox Code Playgroud)

具体来说,我对''的使用感到困惑.

我一直在使用这种资源的MATLAB和Python之间去: http://mathesaurus.sourceforge.net/matlab-numpy.html 但是,它是模糊的"标志似乎具有多种用途.当我寻找其他文件,我找不到"全面解释.

任何帮助将非常感激.理想情况下,我想获得Python等价物,但任何解释都会有所帮助.谢谢!

python syntax matlab numpy

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