如何将两个系列 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]}')
我有以下系列 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]}')