DDR*_*Rpy 5 python conditional-statements dataframe python-3.x pandas
我希望有一个函数,它可以获取任何长度的条件列表,并在所有条件之间放置一个&符号.示例代码如下.
df = pd.DataFrame(columns=['Sample', 'DP','GQ', 'AB'],
data=[
['HG_12_34', 200, 35, 0.4],
['HG_12_34_2', 50, 45, 0.9],
['KD_89_9', 76, 67, 0.7],
['KD_98_9_2', 4, 78, 0.02],
['LG_3_45', 90, 3, 0.8],
['LG_3_45_2', 15, 12, 0.9]
])
def some_func(df, cond_list):
# wrap ampersand between multiple conditions
all_conds = ?
return df[all_conds]
cond1 = df['DP'] > 40
cond2 = df['GQ'] > 40
cond3 = df['AB'] < 0.4
some_func(df, [cond1, cond2]) # should return df[cond1 & cond2]
some_func(df, [cond1, cond3, cond2]) # should return df[cond1 & cond3 & cond2]
Run Code Online (Sandbox Code Playgroud)
我很感激任何帮助.
你可以用functools.reduce它:
from functools import reduce
def some_func(df, cond_list):
return df[reduce(lambda x,y: x&y, cond_list)]Run Code Online (Sandbox Code Playgroud)
或者,像@AryaMcCarthy所说,你可以使用and_运营商包:
from functools import reduce
from operator import and_
def some_func(df, cond_list):
return df[reduce(and_, cond_list)]Run Code Online (Sandbox Code Playgroud)
或者与numpy一样 - @ayhan说 - 这也是合乎逻辑的和减少的:
from numpy import logical_and
def some_func(df, cond_list):
return df[logical_and.reduce(cond_list)]Run Code Online (Sandbox Code Playgroud)
所有三个版本产生 - 用于您的样本输入 - 以下输出:
>>> some_func(df, [cond1, cond2])
Sample DP GQ AB
1 HG_12_34_2 50 45 0.9
2 KD_89_9 76 67 0.7
>>> some_func(df, [cond1, cond2, cond3])
Empty DataFrame
Columns: [Sample, DP, GQ, AB]
Index: []
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |