过滤Pandas DataFrame取决于是否指定了过滤器值

时间:2016-03-11 01:56:20

标签: python pandas dataframe filtering

我正在尝试编写一个函数,它将返回一系列满足某些条件的DataFrame行。

说白了,它看起来像这样:

def get_measurement(measurements_base, data_selection, condition_id="", subject_id="", scan_type_id=""):
        measurement_path = data_selection[(data_selection["condition"] == condition_id)&(data_selection["subject"] == subject_id)&(data_selection["scan_type"] == scan_type_id)]["measurement"]

但是,我希望仅在实际指定要检查的变量时才应用每个条件(由&分隔的语句)。类似的东西:

logical_set=[]
if condition_id:
    logical_set.extend((data_selection["condition"] == condition_id))

我知道它不会像这样 - 但是什么是一种功能性的(如果可能的话)优雅的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以先初始化一个全真布尔选择掩码,并使用每个指定的条件更新掩码:




 #假设df是输入DataFrame&# xA; mask = pd.Series(True,index = df.index)
 if condition_id:
 mask& = df ['condition_id'] == condition_id
 if subject_id:
 mask& = ...
  




如果您有很多列,最好使用字典来表示条件。然后,可以按如下方式实现更通用的选择功能:




  def get_measurement(df,conditions):
 mask = pd.Series(True,index = df.index)
 for k,v in conditions.iteritems():
 mask& =(df [k] == v)
 return df [mask]

 df = pd.DataFrame({'a':[1,2,3],'b':[4,5,6],'measurement':[100,200,300 ]})
 print df
 print get_measurement(df,{'a':1,'b':4})
  

&#xA ;

输出:




  #Input
 a b测量
 0 1 4 100
 1 2 5 200
 2 3 6 300

#选择使用{'a':1,'b':4}
 a b测量
 0 1 4 100