按标准从熊猫数据帧(或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