将数据排序为多索引数据帧

时间:2018-04-27 06:02:30

标签: python pandas

如何将DataFrame中的数据排序为对索引和列使用MultiIndex的DataFrame?

例如,转换自:

     0    1  2     3     4
0  foo  two  A  2.30  0.01
1  foo  one  A  4.12  0.13
2  bar  two  B  9.89  3.66
3  foo  one  A  2.11  9.48
4  bar  two  A  1.07  5.55

到此:

            A           B      
            1     2     1     2
foo one  2.11  9.48   NaN   NaN
    two   2.3  0.01   NaN   NaN
bar one   NaN   NaN   NaN   NaN
    two  1.07  5.55  9.89  3.66

目前,我正在迭代df1中的每一行并更新df2中的值,但我想要一个比这更有效的方法:

for index, row in df1.iterrows():
    df2.loc[(row[0], row[1]), row[2]] = list(row[3:])

1 个答案:

答案 0 :(得分:2)

您可以使用:

def f(x):
    return pd.DataFrame({'a':x.values.ravel()}).rename(lambda x: x + 1)

df = df.groupby([0,1,2])[3,4].apply(f)['a'].unstack([2,3]).sort_index(level=0, axis=1)
df = df.rename_axis((None, None),axis=1).reindex(pd.MultiIndex.from_product(df.index.levels))
print (df)
            A                       B      
            1     2     3     4     1     2
bar one   NaN   NaN   NaN   NaN   NaN   NaN
    two  1.07  5.55   NaN   NaN  9.89  3.66
foo one  4.12  0.13  2.11  9.48   NaN   NaN
    two  2.30  0.01   NaN   NaN   NaN   NaN

<强>解释

  1. 对于每个组,前3列apply自定义函数DataFrame,也是从1开始的增量索引值

  2. unstack重新整形,并按sort_index

  3. 排列Multiindex
  4. 删除列名称(左上角为2),并在reindexMultiIndex.from_product

    MultiIndex添加缺失的目录>