J'ai vu de nombreuses questions similaires mais aucune d'elles ne résout mon problème.
J'ai un très grand ensemble de données dans lequel je veux trouver la différence pour seulement quelques lignes sélectionnées de la ligne précédente. Dans l'exemple suivant, je voudrais obtenir diff () sur pVal en fonction de la valeur de calc, comme indiqué:
df['pDiff'] = df[df['calc']==True]['pVal'].diff()
Remarque: pDiff obtient NaN par défaut p >
On peut simplement calculer la différence pour toutes les lignes et remplacer plus tard pDiff par NaN contre False sous 'calc'. Mais comme indiqué précédemment, j'ai un très grand ensemble de données avec très peu de valeurs «True» dans la colonne calc, donc beaucoup de frais généraux.
J'ai essayé ce qui suit:
pVal calc pDiff 1 .17 False NaN 2 .31 False NaN 3 .46 False NaN 4 .39 True -.07 5 .26 False NaN 6 .6 True .34
Mais cela donne des résultats incorrects, en calculant la différence entre les lignes avec calc == True. Dans notre exemple, la différence pour la ligne 6 est calculée entre les lignes 6 et 4 (0,6 - 0,39 = 0,21), au lieu de 0,34 attendu entre les lignes 6 et 5. La différence pour la ligne 4 reste NaN étant la première ligne avec calc == True.
J'ai la possibilité de parcourir toutes les lignes mais c'est trop lent pour moi.
J'ai besoin d'une solution qui calcule et modifie les valeurs uniquement pour les lignes où calc contient True.
3 Réponses :
Essayez,
df['shifted'] = df.calc.shift() df1 = df[(df.calc == True) | (df.shifted == True)] df1.pdidff = df1.pVal.diff()
np.where + shift sont parfaits ensemble pour la comparaison des lignes précédentes ou suivantes en fonction des conditions :)
df['pDiff'] = np.where((df['calc'] == True), df['pVal'] - df['pVal'].shift(), np.nan)
Exécutez: df ['pDiff'] = np.where (df.calc, df.pVal.diff (), np.nan) .
df.pVal.diff () est la source des données et np.where agit comme un filtre.
df.calc est la condition et np.nan est la valeur "autre".