web-dev-qa-db-fra.com

Utilisation de la fusion sur une colonne et un index dans Pandas

J'ai deux trames de données distinctes qui partagent un numéro de projet. Dans type_df, Le numéro de projet est l'index. Dans time_df, Le numéro de projet est une colonne. Je voudrais compter le nombre de lignes dans type_df Qui ont un Project Type De 2. J'essaie de le faire avec pandas.merge(). Cela fonctionne très bien lors de l'utilisation des deux colonnes, mais pas des index. Je ne sais pas comment référencer l'index et si merge est même la bonne façon de le faire.

import pandas as pd
type_df = pd.DataFrame(data = [['Type 1'], ['Type 2']], 
                       columns=['Project Type'], 
                       index=['Project2', 'Project1'])
time_df = pd.DataFrame(data = [['Project1', 13], ['Project1', 12], 
                               ['Project2', 41]], 
                       columns=['Project', 'Time'])
merged = pd.merge(time_df,type_df, on=[index,'Project'])
print merged[merged['Project Type'] == 'Type 2']['Project Type'].count()

Erreur:

Le nom 'Index' n'est pas défini.

Sortie désirée:

2
27
user2242044

Si vous souhaitez utiliser un index dans votre fusion, vous devez spécifier left_index=True ou right_index=True, puis utilisez left_on ou right_on. Pour vous, cela devrait ressembler à ceci:

merged = pd.merge(type_df, time_df, left_index=True, right_on='Project')
32
maxymoo

Une autre solution consiste à utiliser DataFrame.join :

df3 = type_df.join(time_df, on='Project')

Pour la version pandas 0.23.0+le on, left_on, et right_on les paramètres peuvent désormais faire référence aux noms de colonne ou aux noms de niveau d'index :

left_index = pd.Index(['K0', 'K0', 'K1', 'K2'], name='key1')
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                     'key2': ['K0', 'K1', 'K0', 'K1']},
                    index=left_index)

right_index = pd.Index(['K0', 'K1', 'K2', 'K2'], name='key1')

right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                     'D': ['D0', 'D1', 'D2', 'D3'],
                     'key2': ['K0', 'K0', 'K0', 'K1']},
                      index=right_index)

print (left)    
       A   B key2
key1             
K0    A0  B0   K0
K0    A1  B1   K1
K1    A2  B2   K0
K2    A3  B3   K1

print (right)
       C   D key2
key1             
K0    C0  D0   K0
K1    C1  D1   K0
K2    C2  D2   K0
K2    C3  D3   K1

df = left.merge(right, on=['key1', 'key2'])
print (df)
       A   B key2   C   D
key1                     
K0    A0  B0   K0  C0  D0
K1    A2  B2   K0  C1  D1
K2    A3  B3   K1  C3  D3
7
jezrael

Vous devez avoir la même colonne dans chaque trame de données pour fusionner.

Dans ce cas, créez simplement une colonne "Projet" pour type_df, puis fusionnez là-dessus:

type_df['Project'] = type_df.index.values
merged = pd.merge(time_df,type_df, on='Project', how='inner')
merged
#    Project  Time Project Type
#0  Project1    13       Type 2
#1  Project1    12       Type 2
#2  Project2    41       Type 1

print merged[merged['Project Type'] == 'Type 2']['Project Type'].count()
2
3
dermen