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
3 réponses
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
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)
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)
)
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.