2017-07-07 10 views
1

Ich habe einen Datenrahmen, die dfDays aufgerufen wird, die wie folgt aussehen:Pandas einfügen Wert in Datenrahmen mit loc

siren Groupe nomination_frequence demission_frequence depart_frequence modification_frequence deces_frequence confirmation_frequence sansprecision_frequence nbJoursMoyenne ecart_type nbJoursDernierEvenementExtraction 
0 XXX Dirigeants 1 0 0 0 0 0 0 None NaN 2345 
1 XXX Autres 2 0 2 0 0 0 0 191 270.586 1217 
2 XXX Dirigeants 0 0 0 0 0 0 3 281 281 1283 
3 XXX Dirigeants 2 2 0 0 0 0 0 61 86.7384 1583 
4 XXX Dirigeants 1 1 0 0 0 0 5 93 136.118 1283 

Ich füge in eine neue datadrame genannt dfNew die Werte der dfDays aber das Hinzufügen einer Kategorie nach auf die „groupe“

ist die letzte Datenrahmen Nehmen wir an, dass ich erhalten möchte, ist: (bei den Werten sehen nicht)

siren Dirigeants_nomination_frequence Dirigeants_demission_frequence Dirigeants_depart_frequence Dirigeants_modification_frequence Dirigeants_deces_frequence Dirigeants_confirmation_frequence Dirigeants_sansprecision_frequence MembresDuConseil_nomination_frequence MembresDuConseil_demission_frequence ... mouvement_ecart_type Dirigeants_nbJoursMoyenne Dirigeants_ecart_type Dirigeants_nbJoursDernierEvenementExtraction Autres_nbJoursMoyenne Autres_ecart_type Autres_nbJoursDernierEvenementExtraction MembresDuConseil_nbJoursMoyenne MembresDuConseil_ecart_type MembresDuConseil_nbJoursDernierEvenementExtraction 
0 XXX 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 NaN NaN 2345.0 NaN NaN 0.0 NaN NaN 0.0 
3 XXX 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 ... 0.0 281.0 281.000000 1283.0 191.0 270.586195 1217.0 NaN NaN 0.0 
11 XXX 2.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 61.0 86.738432 1583.0 NaN NaN 0.0 NaN NaN 0.0 
16 XXX 1.0 1.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 ... 0.0 93.0 136.118413 1283.0 NaN NaN 0.0 NaN NaN 0.0 

Hier mein Code, um das zu tun:

liste_nom = ['nomination_frequence','demission_frequence','depart_frequence','modification_frequence','deces_frequence','confirmation_frequence','sansprecision_frequence', 
      'nbJoursMoyenne','ecart_type', 'nbJoursDernierEvenementExtraction'] 

for index, row in dfDays.iterrows(): 
    #print(row) 
    name = row['Groupe'] 
    siren = row['siren'] 
    index = dfRight[dfRight['siren'] == siren].index[0] 

    print(dfNew.columns) 
    for value in liste_nom: 
     #print(row) 
     #print(row[value]) 
     dfNew.loc[index, name + '_' + value] = row[value] 
print(dfNew.columns) 

Mein Problem ist, dass, bevor die ersten .loc mit Index meiner Spalten wie dies mit Blick in dfNew:

Index(['siren', 'Dirigeants_nomination_frequence', 
     'Dirigeants_demission_frequence', 'Dirigeants_depart_frequence', 
     'Dirigeants_modification_frequence', 'Dirigeants_deces_frequence', 
     'Dirigeants_confirmation_frequence', 
     'Dirigeants_sansprecision_frequence', 
     'MembresDuConseil_nomination_frequence', 
     'MembresDuConseil_demission_frequence', 
     'MembresDuConseil_depart_frequence', 
     'MembresDuConseil_modification_frequence', 
     'MembresDuConseil_deces_frequence', 
     'MembresDuConseil_confirmation_frequence', 
     'MembresDuConseil_sansprecision_frequence', 
     'Autres_nomination_frequence', 'Autres_demission_frequence', 
     'Autres_depart_frequence', 'Autres_modification_frequence', 
     'Autres_deces_frequence', 'Autres_confirmation_frequence', 
     'Autres_sansprecision_frequence', 'mouvements_nbJoursMoyenne', 
     'mouvement_ecart_type'], 
     dtype='object') 

Aber nachdem ich verwenden .loc mehr Mal, wenn die Spalte vertauscht und schauen wie folgt:

Index(['siren', 'Dirigeants_nomination_frequence', 
     'Dirigeants_demission_frequence', 'Dirigeants_depart_frequence', 
     'Dirigeants_modification_frequence', 'Dirigeants_deces_frequence', 
     'Dirigeants_confirmation_frequence', 
     'Dirigeants_sansprecision_frequence', 
     'MembresDuConseil_nomination_frequence', 
     'MembresDuConseil_demission_frequence', 
     'MembresDuConseil_depart_frequence', 
     'MembresDuConseil_modification_frequence', 
     'MembresDuConseil_deces_frequence', 
     'MembresDuConseil_confirmation_frequence', 
     'MembresDuConseil_sansprecision_frequence', 
     'Autres_nomination_frequence', 'Autres_demission_frequence', 
     'Autres_depart_frequence', 'Autres_modification_frequence', 
     'Autres_deces_frequence', 'Autres_confirmation_frequence', 
     'Autres_sansprecision_frequence', 'mouvements_nbJoursMoyenne', 
     'mouvement_ecart_type', 'Dirigeants_nbJoursMoyenne', 
     'Dirigeants_ecart_type', 'Dirigeants_nbJoursDernierEvenementExtraction', 
     'Autres_nbJoursMoyenne', 'Autres_ecart_type', 
     'Autres_nbJoursDernierEvenementExtraction', 
     'MembresDuConseil_nbJoursMoyenne', 'MembresDuConseil_ecart_type', 
     'MembresDuConseil_nbJoursDernierEvenementExtraction'], 
     dtype='object') 

Ich verstehe nicht, wie die Verwendung von .loc in der Lage ist, die Reihenfolge meiner Spalten zu tauschen? Danke fürs Lesen.

+0

Es scheint es ein Problem mit Duplikaten ist. Können Sie die Datenstichprobe für einen kleinen Datenrahmen ändern - z. 5 Zeilen und 3 Spalten mit Duplikaten in der Spalte "Groupe" mit der gewünschten Ausgabe? – jezrael

+0

Sie meinen, Sie würden 10 Werte für die Gruppe "Dirigeant" sehen? Bitte beachten Sie, dass der gesamte "Sirenenwert" nicht verdoppelt wird, nur weil ich diese Daten nicht veröffentlichen kann. – Astrus

Antwort

0

Ich glaube, Sie pivot für reshape brauchen, und dann abflachen Multiindex in Spalten von map mit join:

print (df) 
    siren  Groupe nomination_frequence demission_frequence 
1  b  Autres    2.0000     191 
2  c Dirigeants    281.0000     1283 
3  d Dirigeants    86.7384     1583 
4  e Dirigeants    136.1180     1283 

erste Filter Spalten von Liste:

liste_nom = ['nomination_frequence','demission_frequence', ...] + ['siren','Groupe'] 

df = df[liste_nom] 

df = df.pivot(index='siren', columns='Groupe') 
df.columns = df.columns.map('_'.join) 
print (df) 
     nomination_frequence_Autres nomination_frequence_Dirigeants \ 
siren                 
b        2.0        NaN 
c        NaN       281.0000 
d        NaN       86.7384 
e        NaN       136.1180 

     demission_frequence_Autres demission_frequence_Dirigeants 
siren                
b       191.0        NaN 
c        NaN       1283.0 
d        NaN       1583.0 
e        NaN       1283.0 

aber wenn get:

ValueError: Index contains duplicate entries, cannot reshape

bedeutet es t Hier sind Duplikate in Spaltenpaaren für neue Indizes und Spalten.

So müssen pivot_table mit einiger Aggregatfunktion wie mean:

print (df) 
    siren  Groupe nomination_frequence demission_frequence 
1  b  Autres    2.0000     191 <-same b,Autres 
1  b  Autres    5.0000     50 <-same b,Autres 
2  c Dirigeants    281.0000     1283 
3  d Dirigeants    86.7384     1583 
4  e Dirigeants    136.1180     1283 

liste_nom = ['nomination_frequence','demission_frequence', ...] + ['siren','Groupe'] 

df = df[liste_nom] 

df = df.pivot_table(index='siren', columns='Groupe', aggfunc='mean') 
df.columns = df.columns.map('_'.join) 
print (df) 
     demission_frequence_Autres demission_frequence_Dirigeants \ 
siren                
b       120.5        NaN (191 + 50)/2 = 120.5 
c        NaN       1283.0 
d        NaN       1583.0 
e        NaN       1283.0 

     nomination_frequence_Autres nomination_frequence_Dirigeants 
siren                 
b        3.5        NaN 
c        NaN       281.0000 
d        NaN       86.7384 
e        NaN       136.1180 

Aber wenn nötig Spaltennamen ändern, indem Sie tauschen und Sortierung:

liste_nom = ['nomination_frequence','demission_frequence'] + ['siren','Groupe'] 
df = df[liste_nom] 
df = df.pivot_table(index='siren', columns='Groupe', aggfunc='mean') 
df = df.swaplevel(0,1, axis=1).sort_index(axis=1) 
df.columns = df.columns.map('_'.join) 
print (df) 
     Autres_demission_frequence Autres_nomination_frequence \ 
siren                
b       120.5       3.5 
c        NaN       NaN 
d        NaN       NaN 
e        NaN       NaN 

     Dirigeants_demission_frequence Dirigeants_nomination_frequence 
siren                 
b         NaN        NaN 
c        1283.0       281.0000 
d        1583.0       86.7384 
e        1283.0       136.1180 
+0

Es funktioniert dort ist kein "ValueError: Index enthält doppelte Einträge, kann nicht umformen". Aber ich würde gerne loc verwenden, weil ich in einem speziellen Fall Werte wie 0 und NaN eingeben muss ... verstehst du, warum meine Spalten getauscht werden? – Astrus

+0

Überprüfen Sie die Antwort, ich füge Lösung dafür hinzu. – jezrael

+0

Für den Einsatz von LOC? – Astrus

Verwandte Themen