我正试图改变这个系列
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
进入像这样的数据框
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
我试试这个,但没有预期的结果
df= df.to_frame()
df.reset_index(level=0, inplace=True)
df['education'] = df.index
答案 0 :(得分:3)
通过构造函数创建新DataFrame
并添加到原始文件,最后按reset_index
删除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
使用join
和reset_index
作为默认索引的另一种解决方案:
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
如果表现很重要:
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)
答案 1 :(得分:3)
您可以reset_index
和apply(pd.Series)
df=df.reindex(columns=df.columns.tolist()+['sector','education'])
df[['sector','education']]=df.reset_index()['index'].apply(pd.Series).values
答案 2 :(得分:1)
如果您的数据属于系列s
:
df = (
pd.Series(s.index)
.apply(pd.Series, index=["sector", "education"])
.assign(max_ed=s.values)
)