小编Bre*_*arn的帖子

获取pandas.read_csv将空值读取为空字符串而不是nan

我正在使用pandas库读取一些CSV数据.在我的数据中,某些列包含字符串.字符串"nan"是可能的值,空字符串也是如此.我设法让大熊猫把"nan"作为一个字符串来读,但我无法弄清楚如何让它不读取空值作为NaN.这是示例数据和输出

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven
Run Code Online (Sandbox Code Playgroud)

它正确地写着"男"为字符串"南",但仍读取空单元格作为NaN的.我想传递strconverters参数read_csv(带converters={'One': str})),但它仍然读取空单元格作为NaN的.

我知道读书,和fillna后,我可以填补值,但真的没有办法告诉大家,在一个特定的CSV列空单元格应该被解读为空字符串,而不是NaN的熊猫吗?

python csv pandas

67
推荐指数
4
解决办法
7万
查看次数

导入scipy.stats后,Ctrl-C崩溃了Python

我在Win7 64位上运行64位Python 2.7.3.我可以通过这样做可靠地崩溃Python解释器:

>>> from scipy import stats
>>> import time
>>> time.sleep(3)
Run Code Online (Sandbox Code Playgroud)

并在睡眠期间按下Control-C.未引发KeyboardInterrupt; 翻译崩溃了.打印如下:

forrtl: error (200): program aborting due to control-C event
Image              PC                Routine            Line        Source

libifcoremd.dll    00000000045031F8  Unknown               Unknown  Unknown
libifcoremd.dll    00000000044FC789  Unknown               Unknown  Unknown
libifcoremd.dll    00000000044E8583  Unknown               Unknown  Unknown
libifcoremd.dll    000000000445725D  Unknown               Unknown  Unknown
libifcoremd.dll    00000000044672A6  Unknown               Unknown  Unknown
kernel32.dll       0000000077B74AF3  Unknown               Unknown  Unknown
kernel32.dll       0000000077B3F56D  Unknown               Unknown  Unknown
ntdll.dll          0000000077C73281  Unknown               Unknown  Unknown
Run Code Online (Sandbox Code Playgroud)

这使得无法中断长时间运行的scipy计算.

谷歌搜索"forrtl"等,我看到这种问题的建议是由于使用了一个覆盖Ctrl-C处理的Fortran库.我没有看到Scipy跟踪器上的错误但是假设Scipy是一个用于Python的库,我会认为这是一个错误.它打破了Python对Ctrl-C的处理.这有什么解决方法吗?

编辑:关注@ cgohlke的建议我尝试在导入scipy后添加自己的处理程序. 关于相关问题的这个问题表明添加信号处理程序不起作用.我尝试通过pywin32 使用Windows API SetConsoleCtrlHandler函数: …

python scipy keyboardinterrupt

32
推荐指数
2
解决办法
6343
查看次数

pandas基于值而不是计数使用窗口滚动计算

我正在寻找一种方法来做类似各种rolling_*函数的方法pandas,但我希望滚动计算的窗口由一系列值(比如,DataFrame的一列值的值)定义,而不是窗口中的行数.

举个例子,假设我有这些数据:

>>> print d
   RollBasis  ToRoll
0          1       1
1          1       4
2          1      -5
3          2       2
4          3      -4
5          5      -2
6          8       0
7         10     -13
8         12      -2
9         13      -5
Run Code Online (Sandbox Code Playgroud)

如果我做了类似的事情rolling_sum(d, 5),我得到一个滚动的总和,其中每个窗口包含5行.但我想要的是滚动总和,其中每个窗口包含一定范围的值RollBasis.也就是说,我希望能够做类似的事情d.roll_by(sum, 'RollBasis', 5),并得到一个结果,其中第一个窗口包含RollBasis1到5之间的所有行,然后第二个窗口包含所有RollBasis在2到6之间的行,然后是第三个window包含RollBasis3到7之间的所有行,等等.窗口的行数不会相等,但RollBasis每个窗口中选择的值范围将相同.所以输出应该是这样的:

>>> d.roll_by(sum, 'RollBasis', 5)
    1    -4    # sum of elements with 1 <= Rollbasis <= 5
    2    -4    # sum of …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

标准库中的PEP 257 docstring trim?

PEP 257说:

文档字符串处理工具将从文档字符串的第二行和更多行中删除均匀数量的缩进,等于第一行之后所有非空行的最小缩进.文档字符串第一行中的任何缩进(即,直到第一个换行符)都是无关紧要的并被删除.保留docstring中后续行的相对缩进.应从docstring的开头和结尾删除空行.

trim然后在PEP中显示实现该算法的功能.

我可以找到问题,人们会问如何格式化文档字符串,并参考PEP 257(例如,).我还看到一些有关工具的信息,这些工具试图确保您的文档字符串遵循PEP 257(例如,).我找不到的是任何Python库,它实际上一个"文档字符串处理工具",以PEP 257中定义的方式处理文档字符串 - 或者至少,我找不到直接使这个文档字符串处理功能的工具可用.

trimPEP 257中显示的功能是否存在于标准库中?显然我可以自己将函数粘贴到文件中,但如果我使用其他需要此功能的计算机,而不是总是从PEP复制和粘贴,我宁愿在标准库中使用它.鉴于该功能是由BDFL共同编写的PEP,我原以为会有一些官方或半官方图书馆这样做.

我想要这个的原因是编写一个装饰器来做一些Python内部重新格式化类/函数的文档字符串.我不想生成HTML或其他任何东西; 我只想更改实际对象的实际文档字符串.我想获取__doc__Python对象的纯文本属性,并将其重新格式化为将用作Python对象的纯文本属性的东西__doc__.

python docstring

20
推荐指数
1
解决办法
2184
查看次数

从一个函数在Pandas Dataframe中创建多个列

我是一个蟒蛇新手,所以我希望我的两个问题清晰完整.我在下面以csv格式发布了实际代码和测试数据集.

我已经能够使用Newton-Raphson方法构造以下代码(主要是在StackOverflow贡献者的帮助下)来计算期权合约的隐含波动率.该过程在确定隐含波动率时计算Vega.虽然我可以使用Pandas DataFrame apply方法为Implied Volatility创建一个新的DataFrame列,但我无法为Vega创建第二列.当函数将IV和Vega一起返回时,有没有办法创建两个单独的DataFrame列?

我试过了:

  • return iv, vega 从功能
  • df[['myIV', 'Vega']] = df.apply(newtonRap, axis=1)
  • 拿到 ValueError: Shape of passed values is (56, 2), indices imply (56, 13)

还尝试过:

  • return iv, vega 从功能
  • df['myIV'], df['Vega'] = df.apply(newtonRap, axis=1)
  • 拿到 ValueError: Shape of passed values is (56, 2), indices imply (56, 13)

另外,计算过程很慢.我导入了numba并实现了@jit(nogil = True)装饰器,但我只看到了25%的性能提升.测试数据集的性能测试有近900,000条记录.运行时间为2小时9分钟,没有numba或numba,但没有nogil = True.使用numba和@jit(nogil = True)的运行时间是1小时32分钟.我可以做得更好吗?

from datetime import datetime
from math import sqrt, pi, log, exp, isnan
from scipy.stats import norm
from numba import jit


# dff …
Run Code Online (Sandbox Code Playgroud)

python jit multiple-columns pandas numba

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

如何通过拖动使PyQt小部件可调整大小?

我有一个QScrollArea包含一个带有QVBoxLayout的小部件.在这个布局中有几个其他小部件.我希望用户能够拖动这些小部件的下边框以在垂直方向上调整它们的大小.当它们被调整大小时,我不希望它们从滚动区域中的其他小部件"窃取"大小; 相反,我希望整个滚动的"页面"改变其大小.因此,如果您放大其中一个小部件,它应该将其他小部件向下推(在滚动区域的视口之外); 如果你收缩它,它应该拉其他小部件.拖动一个窗口小部件的边框不应该更改垂直滚动中任何其他窗口小部件的大小; 它应该只是移动它们.

我开始使用QSplitter.如果我使用它,我可以拖动来改变小部件的大小,但似乎没有办法让它像上面描述的那样"推/拉"其他小部件,而不是增长/缩小它们.但我找不到任何其他方法来给小部件一个可拖动的句柄,这将允许我改变它的大小.我怎么能做到这一点?

这是我正在做的一个简单的例子.(在这个例子中,我已经注释掉了分割器,但是如果你取消注释它,你可以看到该版本会发生什么.)

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.Qsci import QsciScintilla, QsciLexerPython


class SimplePythonEditor(QsciScintilla):
    def __init__(self, parent=None):
        super(SimplePythonEditor, self).__init__(parent)
        self.setMinimumHeight(50)

class Chunk(QFrame):
    def __init__(self, parent=None):
        super(Chunk, self).__init__(parent)


        layout = QVBoxLayout(self)
        sash = QSplitter(self)
        layout.addWidget(sash)
        sash.setOrientation(Qt.Vertical)

        editor = self.editor = SimplePythonEditor()
        output = self.output = SimplePythonEditor()
        output.setReadOnly(True)

        sash.addWidget(editor)
        sash.addWidget(output)

        self.setLayout(layout)
        print(self.sizePolicy())

class Widget(QWidget):

    def __init__(self, parent= None):
        global inout
        super(Widget, self).__init__()

        #Container Widget        
        widget = QWidget()
        #Layout of Container Widget
        layout = …
Run Code Online (Sandbox Code Playgroud)

python qt resize pyqt qscrollarea

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

在pandas DataFrame上进行就地逐行操作

假设我有这个:

>>> x = pandas.DataFrame([[1.0, 2.0, 3.0], [3, 4, 5]], columns=["A", "B", "C"])
>>> print x
   A  B  C
0  1  2  3
1  3  4  5
Run Code Online (Sandbox Code Playgroud)

现在我想x按行进行标准化- 也就是说,将每一行除以其总和.如本问题所述,这可以通过实现x = x.div(x.sum(axis=1), axis=0).但是,这会创建一个新的 DataFrame.如果我的DataFrame很大,那么即使我立即将它分配给原始名称,也可以在创建这个新的DataFrame时消耗大量内存.

有没有一种有效的方法来执行此操作?我希望像x.idiv()这样的东西可以axis选择div但是更新x到位.对于这个特定的情况,我需要划分,但有时为所有基本操作提供类似的就地版本也是很好的.

(我可以通过逐行迭代并将每个规范化的行分配回原始行来更新它,但这很慢,我正在寻找更有效的解决方案.)

python pandas

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

定义一个 pytest 夹具,为测试函数提供多个参数

使用 pytest,我可以像这样定义一个装置:

@pytest.fixture
def foo():
    return "blah"
Run Code Online (Sandbox Code Playgroud)

并在像这样的测试中使用它:

def test_blah(foo):
    assert foo == "blah"
Run Code Online (Sandbox Code Playgroud)

这一切都很好。但是我想要做的是定义一个“扩展”以向测试函数提供多个参数的单一夹具函数。像这样的东西:

@pytest.multifixture("foo,bar")
def foobar():
    return "blah", "whatever"

def test_stuff(foo, bar):
    assert foo == "blah" and bar == "whatever"
Run Code Online (Sandbox Code Playgroud)

我要定义的两个对象foobar在一起(不作为单独的固定装置),因为它们都以某种方式相关。有时我可能还想定义一个依赖于另一个夹具的夹具,但让第二个夹具合并第一个夹具的结果并将其与自己的添加一起返回:

@pytest.fixture
def foo():
    return "blah"

@pytest.multifixture("foo,bar")
def foobar():
    f = foo()
    return f, some_info_related_to(f)
Run Code Online (Sandbox Code Playgroud)

这个例子可能看起来很傻,但在某些情况下foo就像一个请求对象,并且该bar对象需要链接到同一个请求对象。(也就是说,我不能将foo和定义bar为独立的装置,因为我需要从单个请求派生。)

本质上,我想要做的是将夹具函数的名称与测试函数参数的名称分离,以便我可以定义一个夹具,该夹具由测试函数签名中的一特定参数名称“触发” ,而不仅仅是名称与夹具函数名称相同的单个参数。

当然,我总是可以只返回一个元组作为夹具的结果,然后自己在测试函数中解压它。但是考虑到 pytest 提供了各种神奇的技巧来自动将名称与参数匹配,看起来它也可以神奇地处理这个问题似乎并非不可想象。pytest 可以实现这样的事情吗?

python unit-testing fixtures pytest

7
推荐指数
2
解决办法
2040
查看次数

为Pandas DataFrame的图形设置x轴间隔(刻度)

我正在尝试在Pandas DataFrame的matplotlib图上设置x轴的刻度(时间步长).我的目标是使用DataFrame的第一列作为刻度,但到目前为止我还没有成功.

我到目前为止的尝试包括:

尝试1:

#See 'xticks'
data_df[header_names[1]].plot(ax=ax, title="Roehrig Shock Data", style="-o", legend=True, xticks=data_df[header_names[0]])
Run Code Online (Sandbox Code Playgroud)

尝试2:

ax.xaxis.set_ticks(data_df[header_names[0]])
Run Code Online (Sandbox Code Playgroud)

header_names 只是列标题名称的列表,数据帧如下:

    Compression Velocity   Compression Force  
1               0.000213            6.810879             
2               0.025055          140.693200            
3               0.050146          158.401500            
4               0.075816          171.050200             
5               0.101011          178.639500              
6               0.126681          186.228800              
7               0.150925          191.288300            
8               0.176597          198.877500        
9               0.202269          203.937000        
10              0.227466          208.996500         
11              0.252663          214.056000    
Run Code Online (Sandbox Code Playgroud)

以下是CSV格式的数据:

Compression Velocity,Compression Force
0.0002126891606,6.810879
0.025055073079999997,140.6932
0.050145696,158.4015
0.07581600279999999,171.0502
0.1010109232,178.6395
0.12668120459999999,186.2288
0.1509253776,191.2883
0.1765969798,198.8775
0.2022691662,203.937
0.2274659662,208.9965
0.2526627408,214.056
Run Code Online (Sandbox Code Playgroud)

这是一个阅读和绘制图表的实现:

data_df = pd.read_csv(file).astype(float)
fig = Figure()
ax = fig.add_subplot(111)
ax.set_xlabel("Velocity …
Run Code Online (Sandbox Code Playgroud)

python matplotlib data-analysis pandas

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

从另一个python程序运行python程序(有一定的要求)

假设我有两个python脚本A.pyB.py.我正在寻找一种方法从A中运行B,方式是:

  1. B认为它是__main__(因此if __name__=="__main__"B 中的块中的代码将运行)
  2. B实际上不是__main__(所以它不会,例如,覆盖"__main__"sys.modules中的条目)
  3. B中引发的异常传播到A(即,可以用exceptA中的条款捕获).
  4. 这些异常(如果未捕获)会在B中生成正确的回溯引用行号.

我尝试了各种技术,但似乎都没有满足我的所有要求.

  • 使用子进程模块中的工具意味着B中的异常不会传播到A.
  • execfile("B.py", {}) 运行B,但它不认为它是主要的.
  • execfile("B.py", {'__name__': '__main__'})让B.py认为它是主要的,但它似乎也搞砸了异常回溯打印,因此回溯指的是A中的线(即真实的__main__).
  • 使用imp.load_sourcewith __main__作为名称几乎可以工作,除了它实际上修改了sys.modules,从而踩到了现有的值__main__

有什么方法可以得到我想要的东西吗?

(我这样做的原因是因为我正在对现有的库进行一些清理.这个库没有真正的测试套件,只有一组产生特定输出的"示例"脚本.我试图利用它们作为测试以确保我的清理不会影响库执行这些示例的能力,因此我想从我的测试套件中运行每个示例脚本.我希望能够在测试脚本中看到这些脚本的异常,以便测试脚本可以报告失败的类型,而不是仅在示例脚本引发某些异常时报告通用的SubprocessError.)

python subprocess python-import execfile

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