Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:计算数据帧中的唯一值_Python_Pandas - Fatal编程技术网

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计数
数据帧方法。。。这将使它更加高效和简洁

值得注意的是,pandas
value\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())