Je veux filtrer un dataframe pandas par une fonction le long de l'index. Je n'arrive pas à trouver un moyen intégré d'effectuer cette action.

Donc, essentiellement, j'ai une fonction qui, grâce à des moyens arbitrairement compliqués, détermine si un index particulier doit être inclus, je l'appellerai filter_func pour cet exemple. Je souhaite appliquer exactement ce que fait le code ci-dessous, mais à l'index:

new_index = filter(filter_func, df.index)

Et n'incluez que les valeurs autorisées par filter_func. L'index peut également être de n'importe quel type.

C'est un facteur assez important de manipulation des données, donc j'imagine qu'il existe un moyen intégré de faire cette action.

ETA:

J'ai trouvé que l'indexation du dataframe par une liste de booléens fera ce que je veux, mais nécessite toujours le double de l'espace de l'index pour appliquer le filtre. Ma question demeure donc s'il existe un moyen intégré de le faire qui ne nécessite pas deux fois plus d'espace.

Voici un exemple:

import pandas as pd
df = pd.DataFrame({"value":[12,34,2,23,6,23,7,2,35,657,1,324]})

def filter_func(ind, n=0):
    if n > 200: return False
    if ind % 79 == 0: return True
    return filter_func(ind+ind-1, n+1)

new_index = filter(filter_func, df)

Et je veux faire ça:

mask = []
for i in df.index:
    mask.append(filter_func(i))
df = df[mask]

Mais d'une manière qui ne prend pas deux fois l'espace de l'index pour le faire

2
Recessive 28 août 2020 à 07:49

2 réponses

Meilleure réponse

Vous pouvez utiliser la carte au lieu du filtre, puis effectuer une indexation booléenne:

df.loc[map(filter_func,df.index)]

   value
0     12
4      6
7      2
8     35
2
anky 28 août 2020 à 05:43

Avez-vous essayé d'utiliser df.apply?

>>> df = pd.DataFrame(np.arange(9).reshape(3, 3), columns=['a', 'b', 'c'])
   a  b  c
0  0  1  2
1  3  4  5
2  6  7  8

df[df.apply(lambda x: x['c']%2 == 0, axis = 1)]
   a  b  c
0  0  1  2
2  6  7  8

Vous pouvez personnaliser la fonction lambda comme vous le souhaitez, faites-moi savoir si ce n'est pas ce que vous recherchez.

0
Praneeth Katuri 28 août 2020 à 05:40