我们有一个如下所示的DataFrame:
我们只需对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. 我想按行对数据框进行分组,然后获取每个分组的不同直方图。如果我们忽略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
的一些数字,因为nan
已被删除。
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
看起来有些笨重。如果有更好的选择,我很乐意听取建议。
编辑:丹的评论揭示了我的一个拼写错误,不过即使更正了这个错误,我们还是没有达到目标。
df.stack().groupby(list('aaaabbbb')).value_counts()
对我来说可行。 - Dan Allan