Pandas:在一行中删除多索引中的级别

时间:2017-05-18 08:46:31

标签: python pandas dataframe

这里有一个例子:

df = pd.DataFrame(np.random.rand(100).reshape(20, 5))
df.head()

它给出了:

          0         1         2         3         4
0  0.424436  0.831037  0.685421  0.170769  0.179134
1  0.984879  0.837583  0.289348  0.403940  0.760511
2  0.216087  0.876270  0.849723  0.020144  0.573268
3  0.558212  0.083600  0.345405  0.492531  0.744830
4  0.708427  0.084600  0.743003  0.459426  0.354911

我应用以下功能:

df.groupby([0, 1, 2]).apply(lambda x: pd.DataFrame({
    "3sq": x[3].values**2,
    "4sq": x[4].values**2,
    "3*4": x[3].values*x[4].values,
})).reset_index().head()

结果是:

          0         1         2  level_3       3*4       3sq       4sq
0  0.009899  0.122257  0.159538        0  0.559871  0.501726  0.624755
1  0.105528  0.643789  0.219537        0  0.115762  0.199059  0.067321
2  0.116222  0.196047  0.557748        0  0.773526  0.846430  0.706902
3  0.196865  0.136991  0.457065        0  0.014315  0.064364  0.003184
4  0.216087  0.876270  0.849723        0  0.011548  0.000406  0.328636

如何删除应用功能内嵌的level_3

我尝试在运行apply之前设置索引并尝试在多索引中删除级别,但是没有找到如何在一行中创建它。

1 个答案:

答案 0 :(得分:4)

使用reset_index参数df = df.groupby([0, 1, 2]).apply(lambda x: pd.DataFrame({ "3sq": x[3].values**2, "4sq": x[4].values**2, "3*4": x[3].values*x[4].values, })).reset_index(level=3, drop=True).reset_index() print (df) 0 1 2 3*4 3sq 4sq 0 0.216087 0.876270 0.849723 0.011548 0.000406 0.328636 1 0.424436 0.831037 0.685421 0.030591 0.029162 0.032089 2 0.558212 0.083600 0.345405 0.366852 0.242587 0.554772 3 0.708427 0.084600 0.743003 0.163055 0.211072 0.125962 4 0.984879 0.837583 0.289348 0.307201 0.163168 0.578377

([^\/]+(?=\/))|([^\/]+$)