Pandas DataFrame中的计数透视表

wz1wpwve  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(174)

我有一个Pandas数据框:

Col X    Col Y
class 1    cat 1
class 2    cat 1
class 3    cat 2
class 2    cat 3

我想转化成

cat 1  cat 2  cat 3
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0

其中的值是值计数。我该怎么做呢?

c9qzyr3d

c9qzyr3d1#

以下是重塑数据的几种方法df

In [27]: df
Out[27]:
     Col X  Col Y
0  class 1  cat 1
1  class 2  cat 1
2  class 3  cat 2
3  class 2  cat 3

**1)**使用pd.crosstab()

In [28]: pd.crosstab(df['Col X'], df['Col Y'])
Out[28]:
Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0

**2)**或者,在'Col X','Col Y'上使用groupby,在Col Y上使用unstack,然后用零填充NaNs

In [29]: df.groupby(['Col X','Col Y']).size().unstack('Col Y', fill_value=0)
Out[29]:
Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0

**3)**或者,将pd.pivot_table()index=Col Xcolumns=Col Y一起使用

In [30]: pd.pivot_table(df, index=['Col X'], columns=['Col Y'], aggfunc=len, fill_value=0)
Out[30]:
Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0

**4)**或者,将set_indexunstack一起使用

In [492]: df.assign(v=1).set_index(['Col X', 'Col Y'])['v'].unstack(fill_value=0)
Out[492]:
Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0
vbopmzt1

vbopmzt12#

从pandas 1.1.0开始,value_counts()可以在dataframe上调用。所以另一种方法是对每对Col X-Col Y值进行计数并解栈计数。

table = df[['Col X', 'Col Y']].value_counts().rename_axis([None, None]).unstack(fill_value=0)

相关问题