数据帧:计算所有列中的多次出现,并输出具有相同列的数据帧,单个出现作为索引

问题描述 投票:0回答:1

我有一个像这样的 Pandas 数据框:

>>> df = pd.DataFrame({'2012':['A','A','B','A'],'2013':['A','B','C','C'],'2014':['A','C','Z','C']})
>>> df

  2012 2013 2014
0    A    A    A
1    A    B    C
2    B    C    Z
3    A    C    C

从中,我需要创建另一个像这样的数据框:

   2012  2013  2014
A     3     1     1
B     1     1     0
C     0     2     2

我基本上是在计算每列中标签的一些出现次数(A、B、C,但不是 Z),将它们转换为索引,并显示它们每年的计数。

我确实提出了一个涉及迭代的解决方案:

>>> indexes = ['A','B','C']
>>> for idx in indexes:
        df2.loc[idx] = (df == idx).sum()
>>> df2

   2012  2013  2014
A     3     1     1
B     1     1     0
C     0     2     2

这输出正是我需要的。但我想知道,有没有一种方法可以一次性完成而不需要迭代?

我尝试了values_counts()、pivot_table()和groupby()但没有成功。 我发现的所有 Google 搜索都指向这种类型的计数,但仅跨一列。

预先感谢任何可以提供帮助的人!

pandas dataframe group-by pivot-table countif
1个回答
0
投票

这将为您提供所有字母 A、B、C 和 Z 的计数:

df.stack().groupby(level=1).value_counts().unstack(fill_value=0).T
   2012  2013  2014
A     3     1     1
B     1     1     0
C     0     2     2
Z     0     0     1

然后您可以选择要保留的行:

df.loc[["A", "B", "C"]]
   2012  2013  2014
A     3     1     1
B     1     1     0
C     0     2     2
© www.soinside.com 2019 - 2024. All rights reserved.