【发布时间】:2014-12-02 23:23:27
【问题描述】:
我们有一个如下所示的 DataFrame:
> df.ix[:2,:10]
0 1 2 3 4 5 6 7 8 9 10
0 NaN NaN NaN NaN 6 5 NaN NaN 4 NaN 5
1 NaN NaN NaN NaN 8 NaN NaN 7 NaN NaN 5
2 NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN
我们只需要 DataFrame 中所有唯一值的计数。一个简单的解决方案是:
df.stack().value_counts()
但是:
1. 看起来stack 返回的是一个副本,而不是一个视图,在这种情况下,这会占用大量内存。这个对吗?
2.我想按行对DataFrame进行分组,然后得到每个分组的不同直方图。如果我们忽略stack 的内存问题并暂时使用它,如何正确进行分组?
d = pd.DataFrame([[nan, 1, nan, 2, 3],
[nan, 1, 1, 1, 3],
[nan, 1, nan, 2, 3],
[nan,2,2,2, 3]])
len(d.stack()) #14
d.stack().groupby(arange(4))
AssertionError: Grouper and axis must be same length
堆叠的 DataFrame 有一个 MultiIndex,其长度小于n_rows*n_columns,因为nans 已被删除。
0 1 1
3 2
4 3
1 0 1
1 1
2 1
3 1
4 3
....
这意味着我们不容易知道如何建立我们的分组。只在第一级进行操作会好得多,但是我被困在如何应用我真正想要的分组上。
d.stack().groupby(level=0).groupby(list('aabb'))
KeyError: 'a'
编辑:一种不使用堆叠的解决方案:
f = lambda x: pd.value_counts(x.values.ravel())
d.groupby(list('aabb')).apply(f)
a 1 4
3 2
2 1
b 2 4
3 2
1 1
dtype: int64
虽然看起来很笨重。如果有更好的选择,我很高兴听到。
编辑:Dan 的评论显示我有一个错字,尽管更正仍然没有让我们到达终点线。
【问题讨论】:
-
df.stack().groupby(list('aaaabbbb')).value_counts()为我工作。 -
@DanAllan 嗯,value_counts 快捷方式已在 0.13+ 中关闭(以为它已列入白名单,但猜不...)