web-dev-qa-db-fra.com

Pandas Appliquer une erreur de clé

Je suis assez nouveau pour Python et science des données. Je travaille sur la compétition kaggle Outbrain, et tous les jeux de données référencés dans mon code peuvent être trouvés sur https: // www .kaggle.com/c/outbrain-click-prediction/data .

Passons au problème: j'ai une trame de données avec des colonnes ['document_id', 'category_id', 'confidence_level']. Je voudrais ajouter une quatrième colonne, 'max_cat', Qui renvoie la valeur 'category_id' Qui correspond à la plus grande valeur 'confidence_level' Pour la ligne 'document_id' De la ligne.

import pandas as pd
import numpy

main_folder = r'...filepath\data_location' + '\\'

docs_meta = pd.read_csv(main_folder + 'documents_meta.csv\documents_meta.csv',nrows=1000)
docs_categories = pd.read_csv(main_folder + 'documents_categories.csv\documents_categories.csv',nrows=1000)
docs_entities = pd.read_csv(main_folder + 'documents_entities.csv\documents_entities.csv',nrows=1000)
docs_topics = pd.read_csv(main_folder + 'documents_topics.csv\documents_topics.csv',nrows=1000)

def find_max(row,the_df,groupby_col,value_col,target_col):
   return the_df[the_df[groupby_col]==row[groupby_col]].loc[the_df[value_col].idxmax()][target_col]

test = docs_categories.copy()
test['max_cat'] = test.apply(lambda x: find_max(x,test,'document_id','confidence_level','category_id'))

Cela me donne l'erreur: KeyError: ('document_id', 'occurred at index document_id')

Quelqu'un peut-il m'aider à expliquer pourquoi cette erreur s'est produite ou comment atteindre mon objectif de manière plus efficace?

Merci!

19
user133248

Comme l'a répondu EdChum dans le commentaires . Le problème est que apply fonctionne par colonne par défaut (voir docs ). Par conséquent, les noms de colonne ne sont pas accessibles.

Pour spécifier qu'il doit être appliqué à chaque ligne à la place, axis=1 doit être transmis:

test.apply(lambda x: find_max(x,test,'document_id','confidence_level','category_id'), axis=1)
15
OriolAbril