3 votes

Modifier la fonction pour retourner le dataframe avec les valeurs spécifiées

En ce qui concerne les données de test ci-dessous et la fonction que j'utilise pour identifier les valeurs dans la variable thresh l'un de l'autre.

Est-ce que quelqu'un peut m'aider à le modifier pour obtenir le résultat souhaité ?

Données d'essai

import pandas as pd
import numpy as np
from itertools import combinations
df2 = pd.DataFrame(
       {'AAA' : [4,5,6,7,9,10], 
        'BBB' : [10,20,30,40,11,10],
        'CCC' : [100,50,25,10,10,11],
        'DDD' : [98,50,25,10,10,11],
        'EEE' : [103,50,25,10,10,11]});

Fonction :

thresh = 5    
def closeCols2(df):
        max_value = None
        for k1,k2 in combinations(df.keys(),2):
            if abs(df[k1] - df[k2]) < thresh:
                if max_value is None:
                    max_value = max(df[k1],df[k2])
                else:
                    max_value = max(max_value, max(df[k1],df[k2]))
        return max_value 

Data Before function applied :

    AAA BBB CCC DDD EEE
0   4   10  100 98  103
1   5   20  50  50  50
2   6   30  25  25  25
3   7   40  10  10  10
4   9   11  10  10  10
5   10  10  11  11  11

Sortie de la série de courant après application :

df2.apply(closeCols2, axis=1)

0    103
1     50
2     25
3     10
4     11
5     11
dtype: int64

Sortie souhaitée est un cadre de données montrant toutes les valeurs dans thresh y un nan pour tout ce qui n'est pas dans la fourchette

    AAA BBB CCC DDD EEE
0   nan nan 100 98  103
1   nan nan 50  50  50
2   nan 30  25  25  25
3   7   nan 10  10  10
4   9   11  10  10  10
5   10  10  11  11  11

3voto

piRSquared Points 159

Utiliser mask y sub con axis=1

df2.mask(df2.sub(df2.apply(closeCols2, 1), 0).abs() > thresh)

    AAA   BBB  CCC  DDD  EEE
0   NaN   NaN  100   98  103
1   NaN   NaN   50   50   50
2   NaN  30.0   25   25   25
3   7.0   NaN   10   10   10
4   9.0  11.0   10   10   10
5  10.0  10.0   11   11   11

note :
Je redéfinirais closeCols d'inclure thresh comme paramètre. Ensuite, vous pouvez le passer dans le apply appeler.

def closeCols2(df, thresh):
        max_value = None
        for k1,k2 in combinations(df.keys(),2):
            if abs(df[k1] - df[k2]) < thresh:
                if max_value is None:
                    max_value = max(df[k1],df[k2])
                else:
                    max_value = max(max_value, max(df[k1],df[k2]))
        return max_value 

df2.apply(closeCols2, 1, thresh=5)

crédit supplémentaire
J'ai vectorisé et intégré votre closeCols pour s'amuser en s'abrutissant.
Remarquez qu'il n'y a pas apply

  • numpy diffusion pour obtenir toutes les combinaisons de colonnes soustraites les unes des autres.
  • np.abs
  • <= 5
  • sum(-1) J'ai arrangé le diffusion de telle sorte que la différence entre les rangs 0 , colonne AAA avec toute la rangée 0 seront disposés sur la dernière dimension. -1 en el sum(-1) dit de faire la somme sur la dernière dimension.
  • <= 1 toutes les valeurs sont éloignées de moins de 5 d'elles-mêmes. Je veux donc que la somme de celles-ci soit supérieure à 1. Ainsi, nous masquons toutes les valeurs inférieures ou égales à 1.

v = df2.values
df2.mask((np.abs(v[:, :, None] - v[:, None]) <= 5).sum(-1) <= 1)

    AAA   BBB  CCC  DDD  EEE
0   NaN   NaN  100   98  103
1   NaN   NaN   50   50   50
2   NaN  30.0   25   25   25
3   7.0   NaN   10   10   10
4   9.0  11.0   10   10   10
5  10.0  10.0   11   11   11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X