按其他条件筛选数据帧时包含if语句

2024-04-29 22:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约600行的数据框,可以追溯到2015年:

ID   Year  Trap                             SVL
1    2020  ['P90', 'R81']                   78
2    2019  ['P3']                           56
3    2018  ['P22', 'R1', 'R11', 'PR22']     45

我需要搜索/过滤手头的个体(蜥蜴),已知变量是陷阱和SVL(鼻子到通风口的长度,单位为mm)-例如,当前蜥蜴可能来自陷阱=='R1'及其SVL>;=45,则搜索应返回ID 3。2021年,蜥蜴的SVL=75(它每年增长约10毫米,我加上+/-5毫米的测量误差)

我将这些标准保存在一个目录中:

dict_choice = {'Trap': ['R1'],
               'SVL': (70.0, 80.0)}

我的常规搜索如下所示:

newdf = df.loc[df.Trap.map(set(dict_choice['Trap']).issubset) &
               ( (df['SVL'] >= dict_choice['SVL'][0]) & (df['SVL'] <= dict_choice['SVL'][1]))

我可以将年份作为搜索条件吗? 为了最大限度地减少匹配蜥蜴的数量,我需要添加一个过滤器,从2021年开始,每年我们都会查看小于5mm的SVL。例如,2018年蜥蜴ID 3为45毫米,这意味着2021年蜥蜴ID应为75毫米,但为了匹配它,我们只需要使用SVL来观察蜥蜴<=45 类似这样的逻辑(如果你可以这么说的话!):

if @year == 2021: 
   search all where @Trap IN dict_choice['Trap'] AND ((df['SVL'] >= dict_choice['SVL'][0]) & (df['SVL'] <= dict_choice['SVL'][1]))
elif @year == 2020:
   search all where @Trap IN dict_choice['Trap'] AND ((df['SVL'] >= dict_choice['SVL'][0]) & (df['SVL'] <= dict_choice['SVL'][1]-5))
elif @year == 2019:
   search all where @Trap IN dict_choice['Trap'] AND ((df['SVL'] >= dict_choice['SVL'][0]) & (df['SVL'] <= dict_choice['SVL'][1]-10))
(...)

TL;DR:在按其他条件筛选数据帧时,是否可以包含if语句


Tags: and数据iniddfsearchallwhere
1条回答
网友
1楼 · 发布于 2024-04-29 22:24:27

我可以建议您在您的测试标准中添加一个“固定”的年份吗

dict_choice = {'Trap': ['R1'],
               'SVL': (70.0, 80.0),
               'Year': [2020]}

然后,您可以在代码本身中获得测试的线性余量

import pandas as pd
data = { 'ID': [1,2,3],
         'Year' : [2020,2019,2018],
         'Trap' : [['P90', 'R81'], ['P3'] ,['P22', 'R1', 'R11', 'PR22']],
         'SVL' : [78,56,45]}

df = pd.DataFrame(data)

获取如上所述的数据帧

dict_choice = {'Trap': ['R81'],
               'SVL': (70.0, 80.0),
               'Year': [2018]}

是具有测试基准年的增强查询

newdf = df.loc[df.Trap.map(set(dict_choice['Trap']).issubset) &
               ( (df['SVL'] >= dict_choice['SVL'][0]) & 
                 (df['SVL'] <= dict_choice['SVL'][1] + 5.0 * (df['Year'] - dict_choice['Year'])))]

然后,该查询将线性余量内置到检查中

注意,查询允许蜥蜴在基准年之前生长,在基准年之后生长

也许你应该在两边都移动,但它只是遵循查询的模式(如下所示)

newdf = df.loc[df.Trap.map(set(dict_choice['Trap']).issubset) &
               ( (df['SVL'] >= dict_choice['SVL'][0] + 5.0 * (df['Year'] - dict_choice['Year'])) & 
                 (df['SVL'] <= dict_choice['SVL'][1] + 5.0 * (df['Year'] - dict_choice['Year'])))]

相关问题 更多 >