如何将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:])
答案 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
<强>解释强>:
对于每个组,前3列apply
自定义函数DataFrame
,也是从1
开始的增量索引值
按unstack
重新整形,并按sort_index
Multiindex
列
删除列名称(左上角为2
),并在reindex
和MultiIndex.from_product