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

des*_*esa 2 python dataframe pandas

这里有一个例子:

df = pd.DataFrame(np.random.rand(100).reshape(20, 5))
df.head()
Run Code Online (Sandbox Code Playgroud)

它给:

          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
Run Code Online (Sandbox Code Playgroud)

我应用以下功能:

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()
Run Code Online (Sandbox Code Playgroud)

结果是:

          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
Run Code Online (Sandbox Code Playgroud)

我应该如何level_3使用 apply 函数删除内联?

我尝试在运行之前设置索引apply并尝试在多索引中降低级别,但没有找到如何在一行中进行设置。

jez*_*ael 5

reset_index与参数一起使用drop=True

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
Run Code Online (Sandbox Code Playgroud)