Python 熊猫:计算数据帧中的唯一值
我们有这样一个数据帧:Python 熊猫:计算数据帧中的唯一值,python,pandas,Python,Pandas,我们有这样一个数据帧: > 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 我们只需要数据帧中所有唯一值的计数。一个简单的解决方案是:
> 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
我们只需要数据帧中所有唯一值的计数。一个简单的解决方案是:
df.stack().value_counts()
然而:
1.它看起来像是stack
返回一个副本,而不是一个视图,在这种情况下,这是内存禁止的。这是正确的吗?
2.我想按行对数据帧进行分组,然后为每个分组获得不同的直方图。如果我们忽略堆栈的内存问题,现在就使用它,如何正确分组
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
堆叠数据帧有一个多索引,其长度小于n行*n列
,因为nan
s被删除
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的评论显示我有一个输入错误,尽管纠正这个错误仍然不能让我们到达终点线。我认为您正在进行行/列操作,因此可以使用
应用
:
In [11]: d.apply(pd.Series.value_counts, axis=1).fillna(0)
Out[11]:
1 2 3
0 1 1 1
1 4 0 1
2 1 1 1
3 0 4 1
注:在0.14的工程中有一个值\u计数
数据帧方法。。。这将使它更加高效和简洁
值得注意的是,pandasvalue\u counts
函数也适用于numpy数组,因此您可以将数据帧的值传递给它(作为一维数组视图使用):
此外,您很快就可以正确执行此操作,但您需要堆叠和取消堆叠:
In [22]: d.stack().groupby(level=0).apply(pd.Series.value_counts).unstack().fillna(0)
Out[22]:
1 2 3
0 1 1 1
1 4 0 1
2 1 1 1
3 0 4 1
这个错误似乎有些不言自明(4!=16):
也许你想通过:
In [23]: np.repeat(np.arange(4), 4)
Out[23]: array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3])
没有足够的代表发表评论,但安迪的回答是:
pd.value_counts(d.values.ravel())
是我个人使用过的,在我看来是迄今为止最通用、最容易阅读的解决方案。另一个优点是易于使用列的子集:
pd.value_counts(d[[1,3,4,6,7]].values.ravel())
或
这种方法有什么缺点,或者你想使用stack和groupby的特殊原因吗?
df.stack().groupby(list('aaaabbbb')).value_counts()
对我有用。@DanAllan-Hmmm value_counts快捷方式在0.13+中被关闭了(虽然它被列入了白名单,但我猜不是…)谢谢,Andy。这很接近,但分组仍然不太正确。请看我将要在原始问题中添加的示例。另外,stack是否返回副本而不是视图?问题是NAN使行数变为变量,因此我们无法提前知道如何为d.stack()
构造适当的grouper。最好不使用堆栈
,就像您所做的那样;我只是看不到一种方法来获得适当的分组。@jeffalstott按级别分组,堆栈是一个副本。我不知道最终的结果是什么,你真的想要…得到一个解决方案。很高兴听到有更好的方法。我将同时接受你的答复。
pd.value_counts(d.values.ravel())
pd.value_counts(d[[1,3,4,6,7]].values.ravel())
pd.value_counts(d[["col_title1","col_title2"]].values.ravel())