【问题标题】:Python - reduce number of if statementsPython - 减少 if 语句的数量
【发布时间】:2021-03-31 04:03:15
【问题描述】:

我正在根据一个或多个条件过滤熊猫数据框,如下所示:

def filter_dataframe(dataframe, position=None, team_id=None, home=None, window=None, min_games=0):
        
        df = dataframe.copy()

        if position:
            df = df[df['position_id'] == position] 
        
        if clube_id:
            df = df[df['team_id'] == team_id]
        
        if home:
            if home == 'home':
                df = df[df['home_dummy'] == 1.0]
            elif home == 'away':
                df = df[df['home_dummy'] == 0.0]
        
        if window:
            df = df[df['round_id'].between(1, window)]
        
        if min_games:
            df = df[df['games_num'] >= min_games]

        return df

但我不认为这很优雅。

有没有更简单的方法可以达到同样的效果?

我想为SO answer 中的条件创建规则,然后使用any(rules) 方法来应用过滤(如果有),但我不知道如何处理。有什么想法吗?

【问题讨论】:

  • 可能更适合代码审查?
  • 您可以尝试将列名和参数值传递给过滤器而不是所有参数吗?
  • 是的,可以这样做

标签: python pandas dataframe if-statement


【解决方案1】:

你可以试试这样的:

def filter_dataframe(dataframe, position=None, clube_id=None, team_id=None, home=None, window=None, min_games=0):
    df = dataframe.copy()
    masks = {
        "mask1": [position is not None, df[df["position_id"] == position]],
        "mask2": [clube_id is not None, df[df["team_id"] == team_id]],
        "mask3": [home == "home", df[df["home_dummy"] == 1.0]],
        "mask4": [home == "away", df[df["home_dummy"] == 0.0]],
        "mask5": [window is not None, df[df["round_id"].between(1, window)]],
        "mask6": [min_games is not None, df[df["games_num"] >= min_games]],
    }
    for value in masks.values():
        if value[0]:
            df = value[1]
    return df

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多