2017-09-30 7 views
1

Je suis nouveau pour les pandas et je cherche à refaire ce qui suit à partir de plusieurs feuilles Excel avec plusieurs données.Pandas calculer une nouvelle colonne à travers plusieurs dataframes

Voici la structure de haut niveau:

Master_df
Master_UID | Component_ID_1 | Quantité_1 | ... | Component_ID_8 | Quantity_8

Component_type_1_df
ID_composant | ... | poids

Component_type_2_df
ID_composant | ... | poids

Master_UID [ 'Component_ID_1'] contient de « ID_composant à la fois Component_type_1_df et Component_type_2_df

maintenant dans Master_df, je voudrais créer colonne Weight_1 colonnes en fonction poids de la 2 Component_type_X_df .

multiplié par Master_df ['Quantity_1'].

Merci beaucoup.

+0

oublié de mentionner, Component_type_X_df de n'ont pas la même structure. Aussi, je cherche un moyen d'éviter de fusionner sur Master_df mais d'inclure uniquement de nouveaux calculs. – user319436

Répondre

1
Master_df['Weight_1'] = Master_df['Component_ID'].map(Component_type_1_df.set_index('Component_ID')['weight']) * Master_df['Quantity'] 

Sans avoir un ensemble de données à jouer avec, je ne peux pas garantir que cela fonctionne comme prévu, mais la fonction de carte devrait vous aider à arriver là où vous voulez aller.

Si vous ne voulez pas ajouter à la fin de maître la colonne de poids calculée df vous pouvez effectuer les opérations suivantes:

Master_df.insert({desired_index_position},'Weight_1', Master_df['Component_ID'].map(Component_type_1_df.set_index('Component_ID')['weight']) * Master_df['Quantity') 

En fait, je récemment une question similaire à ce sujet. J'ai posté un ensemble de données pour déranger afin que vous puissiez apprendre la fonction.

PANDAS vlookup against series with common index using map

+0

Salut Yale! Parfait! – user319436

+0

s'il vous plaît accepter la réponse si c'est ce que vous avez couru avec :) –

+0

Salut @ yale-newman! Fonctionne parfaitement! Juste une correction mineure pour quelqu'un d'autre qui contourne cette solution, utilisez '... [weight]) * Master_df [' Quantity_1 ']' pour correspondre à la question. Merci encore et je vais vérifier votre lien pour obtenir mon cerveau excel lentement converti en Pandas :) – user319436

1

Depuis les deux Component_type_*_df DataFrames ne pas ont la même structure, concaténer seulement les parties de ces DataFrames que vous avez besoin, puis fusionner le résultat avec Master_df.

cols = ['Component_ID', 'weight'] 
Components_df = pd.concat([Component_type_1_df[cols], Component_type_2_df[cols]], axis=0) 
Master_df = pd.merge(Master_df, Components_df, 
        left_on='Component_ID_1', 
        right_on='Component_ID', how='left') 
Master_df['weight'] = Master_df['weight'] * Master_df['Quantity_1'] 
Master_df = Master_df.rename({'weight':'Weight_1'}) 

Depuis que nous avons restreint les Component_type_*_df DataFrames à seulement deux colonnes, et une colonne est utilisée comme la clé de fusion, la fusion ajoute qu'une seule colonne supplémentaire, weight-Master_df.

Puisque vous ne souhaitez pas que la colonne weight fusionnée dans Master_df, le code effectue le calcul ci-dessus dans Master_df['weight'] mais renomme puis cette colonne Weight_1.

+0

Salut unutbu, merci pour votre réponse. Désolé, je n'ai pas précisé mais les Component_type_X_df n'ont pas la même structure. Je cherche aussi un moyen d'éviter de fusionner sur Master_df mais d'inclure uniquement de nouveaux calculs. – user319436