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.
4 Réponses :
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)
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.
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.
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.
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
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 .
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.