1
votes

Comment remplacer les valeurs de colonne en fonction de la valeur précédente par condition et sélectionner des lignes dans le dataframe

J'ai un dataframe avec deux colonnes X1 et X2

Première chose: Dans X2 j'ai la valeur 0 et 1, si dans X2 la valeur est 1 lorsque ce changement de 1 à zéro alors dans les 20 prochaines lignes devrait être 1 pas zéro.

par exemple:

df1=df[(df['X1'] == 0) & (df['X2'] ==1)]

Deuxième chose: si X1 = 0 et X2 = 1 puis sélectionnez les lignes de dataframe jusqu'à X2 la valeur reste 1 J'ai essayé ce morceau de code mais il ne sélectionne qu'une seule ligne.

X2=(0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

desired X2=(0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)


6 commentaires

Veuillez fournir un exemple de Daytaframe afin de mieux comprendre votre question.


Ce sont deux questions différentes et devraient probablement être posées séparément. Veuillez également fournir le code que vous avez essayé jusqu'à présent.


@ecortazar pour le premier problème X2 est la colonne de dataframe


@john sloper le code que j'ai essayé pour le deuxième problème


@Nickel Le code de la deuxième chose est correct. Êtes-vous sûr que plusieurs lignes remplissent cette fonction dans la trame de données?


@John Sloper, ce code sélectionne une ligne car la première codition a changé après une ligne, même la valeur de X1 passe de 2 ou 3 mais si X2 est toujours 1, alors doit sélectionner les lignes.


3 Réponses :


2
votes

Modifié pour inclure les deux parties:

# First Thing:
df['X2'] = df['X2'].replace({0: np.nan}).ffill(limit=20).fillna(0)

# Second Thing:
df.loc[(df['X1'] == 0) & (df['X2'] == 1), 'new X2'] = 1
df.loc[(df['X2'] == 0), 'new X2'] = 0
df['new X2'] = df['new X2'].ffill()
df.loc[df['new X2'] == 1] # Selected Rows


4 commentaires

C'est très chouette. Cela change cependant le dtype en float. Peut ou non être un problème.


un astype (int) à la fin ne pouvait pas faire de mal. Cela rendrait simplement la solution un peu plus moche.


@ ecortazar le premier problème est résolu, mais le deuxième code du problème ne fonctionne pas, il donne toutes les lignes de dataframe non seulement les lignes sélectionnées


@Nickel Désolé ,. bien qu'il soit clair que vous deviez faire df [df ['new X2']] pour ne voir que les fichiers sélectionnés. J'ai modifié la réponse.



0
votes

Voici une solution à la "première chose" en utilisant numpy.

import numpy as np

locs =np.where(df['X2'].diff() == -1)[0]
for loc in locs:
    df.loc[slice(loc, loc+20), 'X2'] = 1


0 commentaires

1
votes

Votre cadre de données n'est pas volumineux, vous pouvez donc facilement utiliser la boucle pour résoudre votre problème:

#second prog assuming you have a column X1/X2
df['select'] = False
for index, row in df.iterrows():
    if index > 0 and df['select'][index - 1] == True and row.X2 == 1:
        df.loc[index, 'select'] = True
    if row.X1 == 0 and row.X2 == 1:
        df.loc[index, 'select'] = True

df = df[df['select'] == True].drop('select', axis=1) 

print(df)

#first prog
index = 0
while index < df.shape[0]:
    if index + 1 < df.shape[0] and df['X2'][index] == 1 and df['X2'][index + 1] == 0:
        df.loc[index +1: index + 20,'X2'] = 1            #set 1 to next 20 rows
        break;
    index = index + 1 

print(df)


4 commentaires

si le dataframe n'est pas gros, votre code fonctionne bien, mais je pense que si la taille de ma dataframe augmente, il faudra beaucoup de temps pour terminer ces boucles


@ Frenchy Désolé, j'ai oublié de mentionner la taille des données, j'ai des données de plus de 10000 lignes


vous avez raison, la boucle n'est pas bonne quand vous commencez à avoir plus de 5000 lignes dans ce cas vous avez beaucoup d'autres solutions mais comme vous n'avez pas indiqué le nombre de lignes de votre dataframe, j'ai choisi une solution facile à comprendre .. pour la première boucle prog ou pas boucle n'est pas la question, car seul le premier test est piégé. et vous ne gagnez pas beaucoup de temps, c'est juste pour le deuxième programme, le problème pourrait exister


pour les deuxièmes choses, vous n'avez qu'une étape, après votre explication, il n'y a qu'une seule étape, vous ne spécifiez pas si le processus se poursuit lorsque la première est terminée (20 premières lignes suivantes = 1).