Pandas使用loc将值插入到数据框中

时间:2017-07-07 11:32:42

标签: python pandas

我有一个名为dfDays的数据框,如下所示:

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的值,但根据“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的使用如何能够交换我的列的顺序? 感谢您的阅读。

1 个答案:

答案 0 :(得分:0)

我认为您需要pivot进行重塑,然后在Multiindexmap的列中展平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

按列表首先过滤列:

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:索引包含重复的条目,无法重塑

这意味着新索引和列的列对中存在重复。

因此需要使用mean之类的聚合函数pivot_table

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