Pandas dataframe.query方法语法

ade*_*e1e 7 python pandas

题:

我想更好地理解Pandas DataFrame.query方法以及以下表达式代表的内容:

match = dfDays.query('index > @x.name & price >= @x.target')
Run Code Online (Sandbox Code Playgroud)

什么是@x.name代表?

我理解这个代码(带有pandas.tslib.Timestamp数据的新列)的结果输出是什么,但是没有清楚地理解用于获得此最终结果的表达式.

数据:

从这里:

矢量化的方式来查询日期和价格数据

np.random.seed(seed=1)
rng = pd.date_range('1/1/2000', '2000-07-31',freq='D')
weeks = np.random.uniform(low=1.03, high=3, size=(len(rng),))
ts2 = pd.Series(weeks
               ,index=rng)
dfDays = pd.DataFrame({'price':ts2})
dfWeeks = dfDays.resample('1W-Mon').first()
dfWeeks['target'] = (dfWeeks['price'] + .5).round(2)

def find_match(x):
    match = dfDays.query('index > @x.name & price >= @x.target')
    if not match.empty:
        return match.index[0]

dfWeeks.assign(target_hit=dfWeeks.apply(find_match, 1))
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 9

@x.name- @有助于.query()理解这x是一个外部对象(不属于调用query()方法的DataFrame).在这种情况下x是一个DataFrame.它也可以是标量值.

我希望这个小型演示能帮助你理解它:

In [79]: d1
Out[79]:
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

In [80]: d2
Out[80]:
   a   x
0  1  10
1  7  11

In [81]: d1.query("a in @d2.a")
Out[81]:
   a  b  c
0  1  2  3
2  7  8  9

In [82]: d1.query("c < @d2.a")
Out[82]:
   a  b  c
1  4  5  6
Run Code Online (Sandbox Code Playgroud)

标量x:

In [83]: x = 9

In [84]: d1.query("c == @x")
Out[84]:
   a  b  c
2  7  8  9
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

@MaxU说的一切都很完美!

我想为这个应用的具体问题添加一些上下文.

find_match

这是在数据帧中使用的辅助函数dfWeeks.apply.有两点需要注意:

  1. find_match只需一个参数x.这将是一行dfWeeks.
    • 每行都是一个pd.Series对象,每一行都将通过此函数.这是使用的本质apply.
    • apply通过这个行向辅助功能,行都有一个name属性,该属性是等于在数据帧该行的索引值.在这种情况下,我知道索引值是a pd.Timestamp,我将用它来做我需要做的比较.
  2. find_matchdfDays超出其范围的参考文献find_match.

我不必使用query......我喜欢使用query.我认为它使一些代码更漂亮.OP提供的以下功能可能采用不同的方式编写

def find_match(x):
    """Original"""
    match = dfDays.query('index > @x.name & price >= @x.target')
    if not match.empty:
        return match.index[0]

dfWeeks.assign(target_hit=dfWeeks.apply(find_match, 1))
Run Code Online (Sandbox Code Playgroud)

find_match_alt

或者我们可以做到这一点,这可能有助于解释query字符串在上面做了什么

def find_match_alt(x):
    """Alternative to OP's"""
    date_is_afterwards = dfDays.index > x.name
    price_target_is_met = dfDays.price >= x.target
    both_are_true = price_target_is_met & date_is_afterwards
    if (both_are_true).any():
        return dfDays[both_are_true].index[0]

dfWeeks.assign(target_hit=dfWeeks.apply(find_match_alt, 1))
Run Code Online (Sandbox Code Playgroud)

比较这两个功能应该提供良好的视角.