J'essaye de transformer cette serie

df
index                               max_ed
('Abastecimiento', 'Doctorado)           3
('Abastecimiento', 'Universitario')     50
('Abastecimiento', 'Terciario')        200
('Abastecimiento', 'Secundario')      1150
('Administracion', 'Doctorado)          92
('Administracion', 'Universitario')    250
('Administracion', 'Terciario')        500
('Administracion', 'Secundario')      2150

Dans une trame de données comme celle-ci

max_ed           sector         education
3        Abastecimiento          Doctorado
50       Abastecimiento      Universitario
200      Abastecimiento          Terciario
1150     Abastecimiento         Secundario
92       Administracion          Doctorado
250      Administracion      Universitario
500      Administracion          Terciario
2150     Administracion         Secundario

J'essaye mais sans les résultats attendus

df= df.to_frame()
df.reset_index(level=0, inplace=True)
df['education'] = df.index
2
Lucas Dresl 15 avril 2018 à 18:56

3 réponses

Meilleure réponse

Vous pouvez reset_index et apply(pd.Series)

df=df.reindex(columns=df.columns.tolist()+['sector','education'])

df[['sector','education']]=df.reset_index()['index'].apply(pd.Series).values
3
YOBEN_S 15 avril 2018 à 18:22

Créez un nouveau DataFrame par le constructeur et ajoutez à l'original, supprimez le dernier index par reset_index:

df[['sector','education']] = pd.DataFrame(df.index.tolist(), index=df.index)
df = df.reset_index(drop=True)
print (df)
   max_ed          sector      education
0       3  Abastecimiento      Doctorado
1      50  Abastecimiento  Universitario
2     200  Abastecimiento      Terciario
3    1150  Abastecimiento     Secundario
4      92  Administracion      Doctorado
5     250  Administracion  Universitario
6     500  Administracion      Terciario
7    2150  Administracion     Secundario

Une autre solution avec join et reset_index par défaut indice:

df1 = (df.reset_index(drop=True)
        .join(pd.DataFrame(df.index.tolist(), columns=['sector','education'])))
print (df1)

   max_ed          sector      education
0       3  Abastecimiento      Doctorado
1      50  Abastecimiento  Universitario
2     200  Abastecimiento      Terciario
3    1150  Abastecimiento     Secundario
4      92  Administracion      Doctorado
5     250  Administracion  Universitario
6     500  Administracion      Terciario
7    2150  Administracion     Secundario

Si les performances sont importantes:

df = pd.concat([df] * 1000, ignore_index=True)

def wen(df):
    df=df.reindex(columns=df.columns.tolist()+['sector','education'])

    df[['sector','education']]=df.reset_index()['index'].apply(pd.Series).values
    return df

def jez(df):
    df[['sector','education']] = pd.DataFrame(df.index.tolist(), index=df.index)
    return df

print (jez(df.copy()))
print (wen(df.copy()))

In [396]: %timeit (jez(df.copy()))
2.69 ms ± 50.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [397]: %timeit (wen(df.copy()))
1.53 s ± 45.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
3
jezrael 15 avril 2018 à 18:31

Si vos données sont dans une série s:

df = (
    pd.Series(s.index)
    .apply(pd.Series, index=["sector", "education"])
    .assign(max_ed=s.values)
)
1
pomber 15 avril 2018 à 16:15