如何将两个系列 x 和 y 的 pandas 交叉表的输出数据帧展平为一个系列?

How can I flatten the output dataframe of pandas crosstab from two series x and y into a series?

我有以下系列 x 和 y:

x = pd.Series(['a', 'b', 'a', 'c', 'c'], name='x')
y = pd.Series([1, 0, 1, 0, 0], name='y')

我调用 pd.crosstab 以获取以下数据帧作为输出:

pd.crosstab(x, y)

输出:

y   0   1
x       
a   0   2
b   1   0
c   2   0

我想将其转换为一个系列,如下所示:

x_a_y_0 0
x_a_y_1 2
x_b_y_0 1
x_b_y_1 0
x_c_y_0 2
x_c_y_1 0

对于像这样的特定数据框,我可以通过目视检查来构造它:

pd.Series(
    dict(
        x_a_y_0=0, 
        x_a_y_1=2,
        x_b_y_0=1,
        x_b_y_1=0,
        x_c_y_0=2,
        x_c_y_1=0
    )
)

但是给定任意序列 x 和 y,我如何生成相应的最终输出?

使用 DataFrame.stack 并通过 map 更改 MultiIndex:

s = pd.crosstab(x, y).stack()
s.index = s.index.map(lambda x: f'x_{x[0]}_y_{x[1]}')
print (s)
x_a_y_0    0
x_a_y_1    2
x_b_y_0    1
x_b_y_1    0
x_c_y_0    2
x_c_y_1    0
dtype: int64

也可以传s.index.names,谢谢@SeaBean:

s.index = s.index.map(lambda x: f'{s.index.names[0]}_{x[0]}_{s.index.names[1]}_{x[1]}')