Pandas DataFrame中的计数数据透视表

44
我有一个 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

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

2个回答

95

下面介绍几种重塑数据框 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) 或者,使用 groupby'Col X','Col Y' 上运行,并对 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=列Xcolumns=列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

1
谢谢John - 非常有帮助,尤其是提供了不同的可能性!我甚至没有想到交叉表的可能性。 - SteelyDanish
感谢对这三种方法的比较。我通常使用groupby,也经常看到pivot_table被使用。 - Waylon Walker
2
我发现这个问题是因为我试图弄清楚groupby和pivot_table之间的区别以及何时使用哪一个。你的回答确实很有帮助。你知道有没有一些易于理解的关于不同概念的信息呢?谢谢。 - Fabian Bosler
1
警告:最后一个方法(set_indexunstack)通常不起作用:当原始数据中存在重复行时,它会失败。 - Eric O. Lebigot

1
自从pandas 1.1.0版本以来,可以在数据框上调用value_counts()。因此,另一种方法是计算每对Col X-Col Y值的计数并取消堆叠计数。
table = df[['Col X', 'Col Y']].value_counts().rename_axis([None, None]).unstack(fill_value=0)

transformation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接