在两个分组之后将系列转换为数据帧

时间:2018-04-15 15:56:59

标签: python pandas numpy

我正试图改变这个系列

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

3 个答案:

答案 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

使用joinreset_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_indexapply(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)
)