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

4 réponses

Meilleure réponse

Utilisez DataFrame.groupby :

mask=(df['batsman_runs'].shift(1)==6) & (~df['player_dismissed'].notnull())
df_mask= df[mask]
for i, group in df_mask.groupby('over'):
    print(group)
    sixandinfirst6_df=group

Vous pouvez également créer un dictionnaire de DataFrames et et y accéder en fonction de la valeur over:

df_over={i:group for i, group in df_mask.groupby('over')}
0
ansev 3 nov. 2019 à 15:49

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

Vous pouvez utiliser une boucle de base for pour exécuter une logique répétée. Tutoriel ici.

for i in range(20):
    print(i+1) #use this value for your statement

Les sorties:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0
Rithin Chalumuri 3 nov. 2019 à 15:42

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