我有一个名为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的使用如何能够交换我的列的顺序? 感谢您的阅读。
答案 0 :(得分:0)
我认为您需要pivot
进行重塑,然后在Multiindex
与map
的列中展平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