Je voudrais exécuter le code suivant:

sixandinfirst6_df = df[(df['batsman_runs'].shift(1)==6)& (~df['player_dismissed'].notnull()) & (df['over'] == 1)]

sixandinfirst6_df = df[(df['batsman_runs'].shift(1)==6)& (~df['player_dismissed'].notnull()) & (df['over'] == 2)]

sixandinfirst6_df = df[(df['batsman_runs'].shift(1)==6)& (~df['player_dismissed'].notnull()) & (df['over'] == 3)]

... et ainsi de suite jusqu'à:

sixandinfirst6_df = df[(df['batsman_runs'].shift(1)==6)& (~df['player_dismissed'].notnull()) & (df['over'] == 20)]

Quelle est la meilleure façon de procéder sans coller de copie? Je vous remercie.

0
DanHammond94 3 nov. 2019 à 18:36

2 réponses

Vous pouvez utiliser eval () pour exécuter des chaînes en tant que code:

for i in Range(1, 21): eval(
        "sixandinfirst6_df = df[(df['batsman_runs'].shift(1)==6)& (~df['player_dismissed'].notnull()) & (df['over'] == {})]".format(i))

-1
Sammy 3 nov. 2019 à 15:56

Par souci de simplicité, je vais réécrire l'opération en fonction:

def func(df, x):
  return df[(df['batsman_runs'].shift(1)==6)& (~df['player_dismissed'].notnull()) & (df['over'] == x)]

Maintenant, pour l'appliquer facilement à une plage et en extraire toutes les valeurs souhaitées, vous pouvez utiliser la compréhension de liste. Étant donné que df est déjà défini dans l'exécution suivante, tout ce que vous avez à faire est de:

all_values_from_1_to_20 = [func(df,x) for x in range(1,21)]

La plage génère une séquence à partir de [x, y), étant x la limite inférieure et y la limite supérieure, pour avoir 20 à l'intérieur de la limite supérieure, vous devez passer 21 car la limite supérieure n'est pas inclusive.

0
H_DANILO 3 nov. 2019 à 15:45