2014-09-19 4 views
7

je la dataframe suivante:Pandas recherche basée sur la valeur

Date best a b c d 
1990 a  5 4 7 2 
1991 c  10 1 2 0 
1992 d  2 1 4 12 
1993 a  5 8 11 6 

Je voudrais faire une trame de données comme suit:

Date best value 
1990 a  5 
1991 c  2 
1992 d  12 
1993 a  5 

Je cherche à trouver une valeur basée sur une autre ligne valeur en utilisant des noms de colonnes. Par exemple, la valeur pour 1990 dans la seconde df devrait rechercher "a" à partir de la première df et la deuxième ligne devrait rechercher "c" (= 2) à partir de la première df.

Des idées?

Répondre

4

Vous créez une fonction de recherche et appelez apply sur votre ligne sage dataframe, ce n'est pas très efficace pour les grandes DSF si

In [245]: 

def lookup(x): 
    return x[x.best] 
df['value'] = df.apply(lambda row: lookup(row), axis=1) 
df 
Out[245]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+0

Une chance que vous pourriez expliquer comment ce morceau de code fonctionne? – 3kstc

+0

@ 3kstc nous utilisons essentiellement 'apply' pour itérer sur les lignes en passant argument' axis = 1' donc le lambda ici est la ligne donc pour la première ligne 'x' est la première ligne, nous retournons alors une colonne spécifique qui dans – EdChum

4

Il est construit en lookup fonction qui peut gérer ce type de situation (regarde par rangée/colonne). Je ne sais pas comment c'est optimisé, mais peut-être plus rapide que la solution d'application.

In [9]: df['value'] = df.lookup(df.index, df['best']) 

In [10]: df 
Out[10]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+1

Sur le jeu de données de jouet, la recherche prend 470us, la recherche prend 531us – EdChum

+1

Hmm pour une raison quelconque timeit obtient une erreur de mémoire quand j'essaye ceci même sur une df de taille modeste de dire 4000 lignes , pour 400 lignes, j'obtiens 8,17 ms en utilisant apply et 3,05 ms en utilisant lookup, donc je m'attends à ce que la recherche s'améliore – EdChum

+0

La recherche peut être préférable en raison de la syntaxe plus simple mais les deux fonctionnent parfaitement, les gars! – AtotheSiv

Questions connexes