Python lambda函数在Dataframe查询中

时间:2017-02-27 13:01:15

标签: python pandas dataframe lambda

我有一个DataFrame,格式如下(不是完整尺寸):

    +------------+------+-------+-------+-------+-----+
    |    Date    | Type |  T0   |  T1   |  T2   | ... |
    +------------+------+-------+-------+-------+-----+
    | 2017-01-05 | GBP  | 0.001 | 0.005 | 0.006 |     |
    | 2017-01-05 | USD  | 0.001 | 0.005 | 0.006 |     |
    | 2017-01-05 | EUR  | 0.001 | 0.005 | 0.006 |     |
    | 2017-01-05 | YAN  | 0.001 | 0.005 | 0.006 |     |
    | 2017-01-05 | ZBR  | 0.001 | 0.005 | 0.006 |     |
    | 2017-01-06 | GBP  | 0.001 | 0.005 | 0.006 |     |
    | 2017-01-06 | USD  | 0.001 | 0.005 | 0.006 |     |
    | .......... | ...  |...... |       |       |     |
    +------------+------+-------+-------+-------+-----+

基本上我正在尝试对两个指定日期之间的日期进行过滤,类型等于美元和英镑。我目前可以为日期过滤器而不是类型过滤器执行此操作:

df = df[(df.Date <= EndDate) & (df.Date >= StartDate)]

我似乎无法弄清楚如何过滤我需要的类型(因为它需要“或”而不是“&amp;”)。

此外,我想知道如何在一行中完成所有这些工作。我看到其他人使用lambda做类似的事情,但不太明白这一切是如何工作的。

任何人都可以帮助查询并解释我如何使用Lambda示例实现相同的目标吗?

由于

1 个答案:

答案 0 :(得分:2)

我认为您需要使用isin添加条件:

df1 = df[(df.Date <= EndDate) & (df.Date >= StartDate) & (df.Type.isin(['USD','GBP']))]

query的另一个解决方案:

df2 = df.query('@EndDate >= Date >= @StartDate and Type in ["USD", "GBP"]')

样品:

StartDate = '2017-01-04'
EndDate = '2017-01-05'
df1 = df[(df.Date <= EndDate) & (df.Date >= StartDate) & (df.Type.isin(['USD','GBP']))]
print (df1)
         Date Type     T0     T1     T2
0  2017-01-05  GBP  0.001  0.005  0.006
1  2017-01-05  USD  0.001  0.005  0.006

df2 = df.query('@EndDate >= Date >= @StartDate and Type in ["USD", "GBP"]')
print (df2)
         Date Type     T0     T1     T2
0  2017-01-05  GBP  0.001  0.005  0.006
1  2017-01-05  USD  0.001  0.005  0.006