Pandas dataframe.query方法语法

时间:2017-01-29 14:44:46

标签: python pandas pandas-query

问题:

我希望更好地了解Pandas to-send-mms-with-image方法以及以下表达式所代表的内容:

@EnableJpaRepositories(basePackages="org.bluedolphin.spring.data.mysql")

match = dfDays.query('index > @x.name & price >= @x.target') 代表什么?

我了解此代码的结果输出(带有@x.name数据的新列),但不清楚用于获得此最终结果的表达式。

数据:

从这里开始:

DataFrame.query

pandas.tslib.Timestamp

2 个答案:

答案 0 :(得分:8)

@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

标量x

In [83]: x = 9

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

答案 1 :(得分:5)

@MaxU所说的一切都很完美!

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

find_match

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

  1. find_match只接受一个参数x。这将是dfWeeks的单行。
    • 每一行都是一个pd.Series对象,每一行都将通过此函数传递。这是使用apply
    • 的本质
    • apply将此行传递给辅助函数时,该行的name属性等于数据框中该行的索引值。在这种情况下,我知道索引值是pd.Timestamp,我会用它来进行我需要做的比较。
  2. find_match引用了dfDays本身范围之外的find_match
  3. 我没有必要使用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))
    

    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))
    

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