4
votes

Comment changer plusieurs valeurs de la colonne pandas df en np.nan, en fonction de la condition dans une autre colonne?

Je n'ai pas beaucoup d'expérience dans le codage et c'est ma première question, alors soyez patient avec moi. Je dois trouver un moyen de modifier plusieurs valeurs d'une colonne pandas df en np.nan, en fonction d'une condition dans une autre colonne. Par conséquent, j'ai créé des copies des colonnes requises "Vorgabe" et "Temp".

Chaque fois que la valeur dans "Grad" n'est pas 0, je veux changer les valeurs d'une zone définie dans "Vorgabe" et "Temp" en np.nan.

    OptOpTemp  OpTemp  BSP  Grad  Vorgabe  Temp
0        22.0    20.0    5   0.0     22.0  20.0
1        22.0    20.5    7   0.0     nan   nan      <-one row above
2        22.0    21.0    8   1.0     nan   nan
3        22.0    21.0    6   0.0     nan   nan      <-one row among
4        22.0    23.5    7   0.0     22.0  20.0
5        23.0    21.5    1   0.0     nan   nan
6        24.0    22.5    3   1.0     nan   nan
7        24.0    23.0    4   0.0     nan   nan
8        24.0    25.5    9   0.0     24.0  25.5

Je souhaite donc réaliser quelque chose comme ceci:

print(df)  

    OptOpTemp  OpTemp  BSP  Grad  Vorgabe  Temp
0        22.0    20.0    5   0.0     22.0  20.0
1        22.0    20.5    7   0.0     22.0  20.5
2        22.0    21.0    8   1.0     22.0  21.0
3        22.0    21.0    6   0.0     22.0  21.0
4        22.0    23.5    7   0.0     22.0  20.0
5        23.0    21.5    1   0.0     23.0  21.5
6        24.0    22.5    3   1.0     24.0  22.5
7        24.0    23.0    4   0.0     24.0  23.0
8        24.0    25.5    9   0.0     24.0  25.5

Quelqu'un a-t-il une solution à mon problème? p>

EDIT: Je n'ai peut-être pas été clair. Le but est de changer chaque valeur de "Vorgabe" et "Temp" dans une zone définie en nan. Dans mon exemple, la zone serait une ligne au-dessus, la ligne avec 1.0 et une ligne parmi. Donc pas seulement la ligne, où se trouve 1.0, mais aussi les lignes au-dessus et en dessous.


3 commentaires

Votre sortie ne correspond pas à vos intentions, qu'est-ce que vous voulez exactement? Par exemple, la deuxième ligne est 0 et les valeurs sont nan.


"Chaque fois que la valeur dans" Grad "n'est pas 0, je veux changer les valeurs dans une zone définie" Quelle zone définie? Dans votre exemple, vous avez plusieurs lignes dans lesquelles vous avez changé les valeurs en nan même si Grad est 0.


Dans mon exemple, la zone est une ligne au-dessus et une parmi la ligne, où se trouve le 1.0. J'aurais peut-être dû ajouter cette information, désolé. Donc, non seulement la ligne avec l'un, mais aussi certains ci-dessus et certains parmi, en fonction de la définition que l'utilisateur du code peut définir.


4 Réponses :



5
votes

Utilisez loc :

   OptOpTemp  OpTemp  BSP  Grad  Vorgabe  Temp
0       22.0    20.0    5   0.0     22.0  20.0
1       22.0    20.5    7   0.0     22.0  20.5
2       22.0    21.0    8   1.0      NaN   NaN
3       22.0    21.0    6   0.0     22.0  21.0
4       22.0    23.5    7   0.0     22.0  20.0
5       23.0    21.5    1   0.0     23.0  21.5
6       24.0    22.5    3   1.0      NaN   NaN
7       24.0    23.0    4   0.0     24.0  23.0
8       24.0    25.5    9   0.0     24.0  25.5

Sortie

df.loc[df.Grad != 0.0, ['Vorgabe', 'Temp']] = np.nan
print(df)


1 commentaires

C'est ce que j'entendais par «zone». Non seulement la ligne, où le 1.0 est situé dans "Grad", mais aussi un au-dessus et un parmi. Ce serait le résultat que j'ai essayé de montrer dans mon message. Parfait serait, si je pouvais définir la «zone». Par exemple, changez trois valeurs ci-dessus et trois valeurs parmi à nan. Merci de votre aide.



0
votes

Vous pouvez utiliser df.apply (f, axis = 1) et définir f comme ce que vous voulez faire sur chaque ligne. Votre description semble indiquer que vous voulez

 def f(row):
     if row['Grad']!=0:
         row.loc[['Vorgabe','Temp']]=np.nan
     return row

Cependant, votre exemple semble indiquer que vous voulez autre chose.


1 commentaires

Merci de votre aide. La sortie souhaitée est que je peux définir une zone au-dessus et entre la ligne, où se trouve le 1.0. Et cette zone devrait être changée en nan. Dans mon exemple, la zone serait 1 au-dessus et 1 parmi.



1
votes

Chaîne 3 conditions avec | pour bit à bit OU , pour les lignes au-dessus et au-dessous de 1 utiliser un masque avec shift :

N = 1
r1 = np.concatenate([np.arange(0, N+1), np.arange(-1, -N-1, -1)])
mask1 = np.logical_or.reduce([df['Grad'].shift(x) == 1 for x in r1])

N = 2
r2 = np.concatenate([np.arange(0, N+1), np.arange(-1, -N-1, -1)])
mask2 = np.logical_or.reduce([df['Grad'].shift(x) == 1.5 for x in r2])
#if not working ==1.5 because precision of floats
#mask2 = np.logical_or.reduce([np.isclose(df['Grad'].shift(x), 1.5) for x in r2])

mask = mask1 | mask2
df.loc[mask, ['Vorgabe', 'Temp']] = np.nan
print (df)
   OptOpTemp  OpTemp  BSP  Grad  Vorgabe  Temp
0       22.0    20.0    5   0.0     22.0  20.0
1       22.0    20.5    7   0.0      NaN   NaN
2       22.0    21.0    8   1.0      NaN   NaN
3       22.0    21.0    6   0.0      NaN   NaN
4       22.0    23.5    7   0.0      NaN   NaN
5       23.0    21.5    1   0.0      NaN   NaN
6       24.0    22.5    3   1.5      NaN   NaN <- changed value to 1.5
7       24.0    23.0    4   0.0      NaN   NaN
8       24.0    25.5    9   0.0      NaN   NaN


4 commentaires

Avez-vous également une idée de changer non seulement un ci-dessus et un parmi, mais 2?


@JeddyEastside - Donnez-moi un peu de temps.


Ça a marché. Je ne veux pas vous ennuyer, mais vous semblez être une charge plus habile que moi. Si vous ne voulez pas y consacrer plus de temps, je comprendrais parfaitement cela. La dernière question que j'aurais: avez-vous une idée comment parcourir la colonne et définir votre N = 1 s'il y a un 1.0 dans df ['Grad'] et à N = 2 s'il y a un 1.5 dans df [' Grad ']? Dans les données d'origine, il n'y a pas que des unités dans cette colonne, mais des nombres de un à deux. Et je voudrais définir le N basé sur la valeur qui est dans df ['Grad'].


continuons cette discussion dans le chat .