我有一个像这样的 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 搜索都指向这种类型的计数,但仅跨一列。
预先感谢任何可以提供帮助的人!
这将为您提供所有字母 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