簡體   English   中英

Pandas:計算數據框中的唯一值

[英]Pandas: Counting unique values in a 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.我想按行對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少一些,因為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

但是看起來很笨重。 如果有更好的選擇,我很高興聽到它。

編輯:丹的評論顯示我有一個錯字,雖然糾正仍然沒有讓我們到達終點。

我認為你正在進行行/列操作,所以可以使用apply

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

注意:有一個value_counts DataFrame方法可用於0.14 ...這將使這更有效,更簡潔。

值得注意的是,熊貓value_counts功能還工作的numpy的陣列上,這樣就可以把它傳遞數據幀的值(如使用1-d陣列視圖 np.ravel ):

In [21]: pd.value_counts(d.values.ravel())
Out[21]: 
2    6
1    6
3    4
dtype: int64

此外,你非常接近正確,但你需要堆疊和取消堆棧:

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):

len(d.stack()) #16
d.stack().groupby(arange(4))
AssertionError: Grouper and axis must be same length

也許你想通過:

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()) 

要么

pd.value_counts(d[["col_title1","col_title2"]].values.ravel()) 

這種方法有什么不利,或者你想使用stack和groupby的任何特殊原因?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM