2017-07-07 57 views
1

我有一個名爲dfDays看起來像這樣的數據幀:熊貓插入值到數據幀與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 

我加入到一個名爲dfNew的dfDays的價值新datadrame但根據添加的類別以「GROUPE」

讓我們假設我想獲得最終的數據框是:(不看值)

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 

這裏是我的代碼,爲了做到這一點:

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) 

我的問題是使用第一的.loc索引之前我的專欄看起來像這樣在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') 

但我使用的.loc多時間後柱進行交換,並期待像這樣:

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

我不明白如何使用.loc能夠交換我的列順序? 感謝您的閱讀。

+0

似乎有問題重複。你能否改變小數據幀的數據樣本 - 例如5行和3列,在'Groupe'列中有重複,並且具有所需的輸出? – jezrael

+0

你的意思就像你會看到10個值的羣體「Dirigeant」例如?請注意,所有'siren'的價值都不重複,只是因爲我無法公開這些數據。 – Astrus

回答

0

我認爲你需要pivot的重塑,然後用join通過map壓平列Multiindex:通過列表

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 

第一過濾列:

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 

但如果得到:

ValueError: Index contains duplicate entries, cannot reshape

這意味着t這裏是新的索引和列的成對副本。

所以需要pivot_table與像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 

但是,如果需要通過交換和排序更改列名稱:

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

它的工作沒有「ValueError:索引包含重複的條目,無法重塑」。但我想使用loc,因爲我需要在某些特殊情況下輸入值0和NaN ......你知道爲什麼它會讓我的列交換嗎? – Astrus

+0

檢查答案,我爲其添加解決方案。 – jezrael

+0

對於使用LOC? – Astrus