我正在尝试编写一个函数,它将返回一系列满足某些条件的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))
我知道它不会像这样 - 但是什么是一种功能性的(如果可能的话)优雅的方法来解决这个问题?
答案 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