Python Pandas pivot:如何在不引入额外行的情况下使用所有NaN保留行

Python Pandas pivot:如何在不引入额外行的情况下使用所有NaN保留行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想为我正在使用的一些指标创建一个轴心。但是,在某些情况下,对于特定的年份,没有一个度量值存在 这将导致该行消失。我想在创建轴时保留这一行,但同时保留任何额外的列。然而,这似乎会导致dropna=False参数出现问题,此时会创建额外的行。示例如下: import numpy as np import pandas as pd df = pd.DataFrame({"country":["a", "a", "a",

我想为我正在使用的一些指标创建一个轴心。但是,在某些情况下,对于特定的年份,没有一个度量值存在

这将导致该行消失。我想在创建轴时保留这一行,但同时保留任何额外的列。然而,这似乎会导致
dropna=False
参数出现问题,此时会创建额外的行。示例如下:

import numpy as np
import pandas as pd
df = pd.DataFrame({"country":["a", "a", "a", "a", "b", "b", "b", "b"],
              "metric": ["M1", "M2", "M1", "M2", "M1", "M2", "M1", "M2",],
              "year": [2000, 2000, 2001, 2001, 2000, 2000, 2001, 2001, ],
              "extra_val": ["a_val", "a_val", "a_val", "a_val", "b_val", "b_val", "b_val", "b_val"],
              "metric_val": [1, 2, 3, 4, np.nan, np.nan, 7, 8],
              })

out1 = df.pivot_table("metric_val", index=["country", "year", "extra_val"], columns="metric")
print(out1)
输出1:对于b国,在2000年,因为都是南部,所以这一排消失了

metric                   M1   M2
country year extra_val          
a       2000 a_val      1.0  2.0
        2001 a_val      3.0  4.0
b       2001 b_val      7.0  8.0
现在,

输出2:这里,
extra_val
列似乎被视为一个新的级别,并且正在创建带有NAN的额外行。我希望保留此列,而不保留这些额外的行(此列保证具有到国家/地区的1:1映射)

我想要的是

desired = out2.iloc[[0, 2, 5, 7]]
print(desired)
详细说明所需的输出:这就是我希望输出的样子(索引是为演示而硬编码的,我不能在实际数据中硬编码索引。)

如何获得此输出?

Pivot(几乎)等同于
set\u index()。unstack()

输出:

metric                   M1   M2
country year extra_val          
a       2000 a_val      1.0  2.0
             b_val      NaN  NaN
        2001 a_val      3.0  4.0
             b_val      NaN  NaN
b       2000 a_val      NaN  NaN
             b_val      NaN  NaN
        2001 a_val      NaN  NaN
             b_val      7.0  8.0
desired = out2.iloc[[0, 2, 5, 7]]
print(desired)
metric                   M1   M2
country year extra_val          
a       2000 a_val      1.0  2.0
        2001 a_val      3.0  4.0
b       2000 b_val      NaN  NaN
        2001 b_val      7.0  8.0
(df.set_index(['country','metric','year','extra_val'])
    ['metric_val'].unstack('metric')
)
metric                   M1   M2
country year extra_val          
a       2000 a_val      1.0  2.0
        2001 a_val      3.0  4.0
b       2000 b_val      NaN  NaN
        2001 b_val      7.0  8.0