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
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')
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
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