簡體   English   中英

通過min-max kwargs過濾熊貓數據框

[英]Filtering pandas dataframe by min-max kwargs

我有一個函數,該函數具有基於用戶輸入的最小值和最大值的可選kwargs(共8個)。

例如GR_min, GR_max, GR_N_min, GR_N_max, Hi_min, Hi_max等...其中數據幀GR_N 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自身進行過濾。

有什么辦法嗎?

DataFrame.query在這里可以很方便,因為它將解析包含條件的字符串。 因此,從關鍵字參數構建條件字符串就足夠了。

每個單獨的條件可被構建為: K<=val用於K_max=val參數,以及K>=val用於K_min=val參數。 要構建列表,必須將每個單獨的條件括在括號( () )中,然后與&聯接。

代碼可以是:

def picker(data, **kwargs):
    def make_cond(k,v):
        if len(k)<5:
            raise(ValueError('Arg too short {}'.format(k)))
        if k.endswith('_min'):
            return '({}>={})'.format(k[:-4], v)
        elif k.endswith('_max'):
            return '({}<={})'.format(k[:-4], v)
        else:
            raise(ValueError('Unknow arg {}'.format(k)))
    strcond='&'.join((make_cond(k, v) for k,v in kwargs.items()))
    # print(strcond)     # uncomment for traces
    return data.query(strcond)

您可以為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

我對此感到有些困惑,基於列中的最小-最大值進行過濾根本就不會進行過濾,不是嗎? 為什么不僅僅根據提供的參數進行過濾? 無論如何,這聽起來像是默認參數的情況。

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM