通过min-max kwargs过滤熊猫数据框

时间:2019-03-14 13:43:36

标签: python python-3.x pandas dataframe kwargs

我有一个函数,该函数具有基于用户输入的最小值和最大值的可选kwarg(共8个)。

例如GR_min, GR_max, GR_N_min, GR_N_max, Hi_min, Hi_max等...,其中数据框列为GRGR_NHi等...

我希望数据框根据给定的最小值和最大值进行过滤,但是如果在函数调用中未给出一个或多个值以将默认的最小值-最大值设置为列。

例如一些伪代码:

df = pd.DataFrame({'GR': [1, 2, 3, 4, 2, 3], 
'GR_N': [0.8, 0, 1, 0.6, 0.9, 1], 'Hi':[3, 6, 2, 5, 22, 7]})

得到我:

    GR  GR_N    Hi
0   1   0.8     3
1   2   0.0     6
2   3   1.0     2
3   4   0.6     5
4   2   0.9     22
5   3   1.0     7

我想要一个执行以下操作的函数:

def picker(data, **kwargs):

      data_filtered = data[data['GR'].between(GR_min, GR_max) &
                         data['GR_N'].between(GR_N_min, GR_N_max) &
                         data['Hi'].between(Hi_min, Hi_max)]

      return data_filtered

在调用成为后显示输出:

picker(data=df, GR_min=2, GR_max=3, Hi_min=1, Hi_max=6)

    GR  GR_N    Hi
1   2   0.0     6
2   3   1.0     2

除了不显式调用数据框的每一列,我们使用** kwargs自身进行过滤。

有什么办法吗?

3 个答案:

答案 0 :(得分:1)

index在这里很方便,因为它将解析包含条件的字符串。因此,足以通过关键字参数构建条件字符串。

每个单独的条件都可以构建为:Item用于参数numberany用于参数DataFrame.query。要构建列表,必须将每个单独的条件括在括号(K<=val)中,然后与K_max=val结合在一起。

代码可能是:

K>=val

答案 1 :(得分:0)

您可以为kwargs使用默认字典,将min和max指定为-infinity和+ infinity,然后使用用户输入覆盖它们。像这样:

import numpy as np
def picker(data, **kwargs):
    d = dict(GR_min=-np.inf, GR_max=np.inf) # ... etc
    kwargs = {**d, **kwargs}
    data_filtered = data[data['GR'].between(kwargs["GR_min"], kwargs["GR_max"])] # ... etc
    return data_filtered

答案 2 :(得分:0)

对此我有点困惑,基于列中的min-max值进行过滤根本就不会进行过滤,不是吗?为什么不仅仅根据提供的参数进行过滤?无论如何,这听起来像是默认参数的情况。

#create the DataFrame
df = pd.DataFrame({'GR': [1, 2, 3, 4, 2, 3], 
'GR_N': [0.8, 0, 1, 0.6, 0.9, 1], 'Hi':[3, 6, 2, 5, 22, 7]})

def picker(df, GR_min = None, GR_max = None, GR_N_min = None, GR_N_max = None,
           Hi_min = None, Hi_max = None): #use default arguments

           if GR_min == None:
               GR_min = df['GR'].min()
           if GR_max == None:
               GR_max = df['GR'].max()
           if GR_N_min == None:
               GR_N_min = df['GR_N'].min()
           if GR_N_max == None:
               GR_N_max == df['GR_N'].max()

           #filter the DataFrame with masks
           df_out = df.loc[(df['GR'] > GR_min) & (df['GR'] < GR_max) & 
                           (df['GR_N'] > GR_N_min) & (df['GR_N'] < GR_N_max)]
           return df_out