Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按标准从熊猫数据帧(或numpy ndarray?)中选择_Numpy_Pandas - Fatal编程技术网

按标准从熊猫数据帧(或numpy ndarray?)中选择

按标准从熊猫数据帧(或numpy ndarray?)中选择,numpy,pandas,Numpy,Pandas,我发现自己经常编写这种模式: 从最后的deltmp可以猜到,创建tmp的唯一原因是,我可以在应用于它的索引表达式中使用一个涉及它的布尔表达式 我很想消除对这种(其他无用的)中间体的需求,但我不知道有什么有效的方法可以做到这一点。(如果我错了,请纠正我!) 第二,我想把这个模式推广到一些辅助函数。问题在于找到一种合适的方法将传递给它。我只能想到不雅的东西。例如: def filterobj(obj, criterion): return obj[eval(criterion % 'obj'

我发现自己经常编写这种模式:

从最后的
deltmp
可以猜到,创建
tmp
的唯一原因是,我可以在应用于它的索引表达式中使用一个涉及它的布尔表达式

我很想消除对这种(其他无用的)中间体的需求,但我不知道有什么有效的方法可以做到这一点。(如果我错了,请纠正我!)

第二,我想把这个模式推广到一些辅助函数。问题在于找到一种合适的方法将
传递给它。我只能想到不雅的东西。例如:

def filterobj(obj, criterion):
    return obj[eval(criterion % 'obj')]
这实际上是可行的2:


这是我能得到的最简洁的:

(df.xs('A')['II'] - df.xs('B')['II']).apply(lambda x: x if (x<0) else np.nan).dropna()

Int
0     -4.488312
1     -0.666710
2     -1.995535
Name: II

(df.xs('A')['II']-df.xs('B')['II'])。apply(lambda x:x if(x)由于Python的工作方式,我认为这将是一个艰难的过程。我只能想到一些只会让你走一段路的黑客。比如

def filterobj(obj, fn):
    return obj[fn(obj)]

filterobj(df.xs('A')['II'] - df.xs('B')['II'], lambda x: x < 0)
>>> this
this
>>> this < 3
this < 3
>>> df[this < 3]
Traceback (most recent call last):
  File "<ipython-input-34-d5f1e0baecf9>", line 1, in <module>
    df[this < 3]
[...]
KeyError: u'no item named this < 3'
>>> tmp = df["I"] + df["II"]
>>> tmp[tmp < 0]
Alpha  Int
A      4     -0.464487
B      3     -1.352535
       4     -1.678836
Dtype: float64
>>> filterobj(df["I"] + df["II"], this < 0)
Alpha  Int
A      4     -0.464487
B      3     -1.352535
       4     -1.678836
Dtype: float64
然后在特殊情况下,将
这个
处理成熊猫,或者仍然具有如下功能

def filterobj(obj, criterion):
    return obj[eval(str(criterion.subs({"this": "obj"})))]
(如果做了足够多的工作,我们可能会丢失
eval
,这只是概念的证明)

def filterobj(obj, fn):
    return obj[fn(obj)]

filterobj(df.xs('A')['II'] - df.xs('B')['II'], lambda x: x < 0)
>>> this
this
>>> this < 3
this < 3
>>> df[this < 3]
Traceback (most recent call last):
  File "<ipython-input-34-d5f1e0baecf9>", line 1, in <module>
    df[this < 3]
[...]
KeyError: u'no item named this < 3'
>>> tmp = df["I"] + df["II"]
>>> tmp[tmp < 0]
Alpha  Int
A      4     -0.464487
B      3     -1.352535
       4     -1.678836
Dtype: float64
>>> filterobj(df["I"] + df["II"], this < 0)
Alpha  Int
A      4     -0.464487
B      3     -1.352535
       4     -1.678836
Dtype: float64
tmp=df[“I”]+df[“II”] >>>tmp[tmp<0] 阿尔法整数 A 4-0.464487 B 3-1.352535 4 -1.678836 数据类型:64 >>>过滤器bj(df[“I”]+df[“II”],这<0) 阿尔法整数 A 4-0.464487 B 3-1.352535 4 -1.678836 数据类型:64

会有用的。我不确定这些是否值得头痛,不过,Python对这种风格不是很有帮助。

让我想起了他们试图用Bokeh复制ggplot的做法……不像在R中那样简单,它似乎只是使用
结果
的名称作为
tmp
;)
>>> tmp = df["I"] + df["II"]
>>> tmp[tmp < 0]
Alpha  Int
A      4     -0.464487
B      3     -1.352535
       4     -1.678836
Dtype: float64
>>> filterobj(df["I"] + df["II"], this < 0)
Alpha  Int
A      4     -0.464487
B      3     -1.352535
       4     -1.678836
Dtype: float64