2017-07-07 54 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