1. 程式人生 > >pandas:對dataframe進行groupby後求眾數mode

pandas:對dataframe進行groupby後求眾數mode

1. 問題

有如下一個dataframe,打算對a的每一個類別求b的眾數(mode),dir(df.groupby('a'))可以看到是沒有mode函式的,因此不能直接使用df.groupby('a').mode().reset_index()

>>> import pandas as pd
>>> df = pd.DataFrame({'a':['A','A','A','A','B','B','B','B','B'],'b':[1,1,2,3,1,2,2,3,3]})
>>> df
   a  b
0  A  1
1  A  1
2  A  2
3 A 3 4 B 1 5 B 2 6 B 2 7 B 3 8 B 3 >>> df.groupby('a').mode().reset_index() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 548, in __getattr__ return self._make_wrapper(attr) File "C:\Python27\lib\site-packages\pandas\core\groupby.py"
, line 562, in _make_wrapper raise AttributeError(msg) AttributeError: Cannot access callable attribute 'mode' of 'DataFrameGroupBy' objects, try using the 'apply' method >>> type(df.groupby('a')) <class 'pandas.core.groupby.DataFrameGroupBy'> >>> dir(df.groupby('a')) ['__bytes__
', '__class__', ... ... 'std', 'sum', 'tail', 'take', 'transform', 'tshift', 'var']

2. 解決方案

既然df.groupby('a')沒有mode函式,又考慮到可能聚合函式agg能夠接用外部函式,搜尋網上的解決辦法,經過嘗試,在此總結並列出以下幾種解決方案(當然也可以直接跳到最後一個解決方案)。

  1. 使用scipy.stats.mode():df中的B類別有兩個眾數,返回的結果B類別的眾數取了較小的結果

    >>> from scipy import stats
    >>> df.groupby('a').agg(lambda x: stats.mode(x)[0][0]).reset_index()
       a  b
    0  A  1
    1  B  2
  2. 使用value_counts()
    (1) 先看value_counts()的作用:可以看到得到的結果中的index是取值,內容是計數,並且index是降序排列的,因此取index[0]是取最大值,因此有兩個眾數以上的時候,會取到較大的結果

    >>> ss = pd.Series([1,2,2,3,3])
    >>> ss
    0    1
    1    2
    2    2
    3    3
    4    3
    dtype: int64
    >>> ss.value_counts()
    3    2
    2    2
    1    1
    dtype: int64
    >>> ss.value_counts().index[0]
    3

    (2) 應用到dataframe的groupby之後的聚合函式中:

    >>> df.groupby('a').agg(lambda x: x.value_counts().index[0]).reset_index()
       a  b
    0  A  1
    1  B  3
  3. 使用pd.Series.mode():該函式是返回Series的眾數的,當眾數有多個時,會返回一個list,裡面包含了所有眾數

    >>> df.groupby('a').agg(pd.Series.mode).reset_index()
       a       b
    0  A       1
    1  B  [2, 3]
  4. 使用pd.Series.mode()np.mean():上述結果顯然不是我想要的,但是如果對有多個眾數的結果取均值作為新的眾數,是較為滿意的結果,則可以這樣

    >>> import numpy as np
    >>> df.groupby('a').agg(lambda x: np.mean(pd.Series.mode(x))).reset_index()
      a    b
    0  A  1.0
    1  B  2.5

相關推薦

pandasdataframe進行groupbymode

1. 問題 有如下一個dataframe,打算對a的每一個類別求b的眾數(mode),dir(df.groupby('a'))可以看到是沒有mode函式的,因此不能直接使用df.groupby('a').mode().reset_index() >&g

python(46)字典進行排序

nav last itblog dac 註意 file trace erro [1] 原文地址: http://www.cnblogs.com/kaituorensheng/archive/2012/08/07/2627386.html 字典,形如 dic = {‘a‘

python中的Dataframe中用groupby如何得到每組的行(或者叫每組的大小)

我之前的資料myDF是這樣的:這只是其中的一部分 現在我想根據 車的ID對資料進行分類,然後得到每種車的記錄數,可以進行如下操作: myDF=myDF.groupby(myDF["車的ID"]).agg("count") 得到的結果如下: 可以看到每一行裡面除了車的ID和

【轉載】BP進行增強(螢幕欄位擴充),如何通過BAPI建立BP

建立BP成功後,直接呼叫更改客戶的一般資料 函式進行更改,注意幾個輸入引數。         CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL'  &nbs

java爬蟲之入門基礎 java讀取txt檔案,字串進行操作匯出txt檔案

相比於C#,java爬蟲,python爬蟲更為方便簡要,首先呢,python的urllib2包提供了較為完整的訪問網頁文件的API,再者呢對於摘下來的文章,python的beautifulsoap提供了簡潔的文件處理功能,這就成就了他爬蟲的優勢。 作為一名滿腦子要成為一名大牛的程式設計師小白來講,倒不是非要

幾維安全CEO範俊偉程式碼進行加密或能更有效應對網路攻擊

11月17日,由幾維安全和看雪學院聯合主辦的“2018物聯網安全行業論壇”在北京舉行。幾維安全CEO範俊偉在論壇上表示,由於攻擊者可直接購買、拆解物聯網終端,一旦獲取其程式碼,分析程式碼漏洞,就可進行攻擊。如果對程式碼進行加密,即使攻擊者拿到程式碼,也難以分析業務漏洞並實施攻擊。 幾維安全

React中專案進行打包,無法進用serve-s build進行修改路徑

前提:已經安裝進去了create-react-app。 今天早上就關於用命令: npm install -g serve 安裝了serve的包之後,用指令進行修改命令,就發現瞭如下的報錯: 看樣子那個serve的包已經安裝上去了,但是就是出現上面的報錯,在網上

多尺度小波分解與重構,matlab,係數進行處理,構造C,重構訊號1

自己要解決的問題是,用小波分解對時間序列進行多尺度分解,再分別對各系數進行預測,最後重構得到最後的預測結果。 因為對係數進行了新的處理,所以不能直接用waverec函式重構原始訊號,而需要先構造C,再用waverec函式重構原始訊號。 所以這裡主要解決的問題是

JAVA實驗二陣列進行初始化、賦值、按形式列印

題目:按照要求使用Java編碼。 (1)以型別int[][]宣告一個叫matrix的二維陣列變數,將矩陣初始化為一個5個元素的陣列。 (2)以下列方式為matrix的內部元素賦值:matrix從零開始迴圈到其長度值;例如索引為i,在每次迭代中,將matrix[i]指向一個新的整數

SQL小程式字串進行分割,返回Table(表)物件

經常把儲存過程(含引數)中取得片接的大字串(字串1;字串2;字串3;)進行分割再處理~ 比如,其他系統通過WebService介面呼叫,傳入大串工號片接字串(K17000205;K17000658;K16002598;K17001422),程式通過以下邏輯進行分割,返回Table物件.

pandas怎樣資料進行遍歷

pandas.DataFrame.iterrows DataFrame.iterrows() 迭代(iterate)覆蓋整個DataFrame的行中,返回(index, Series)對。 import numpy as np import panda

python裡使用iterrows()dataframe進行遍歷

假設我們有一個很簡單的OTU表: 現在對這個表格進行遍歷,一般寫法為: import pandas as pd otu = pd.read_csv("otu.txt",sep="\t") fo

引數進行排序拼接key,進行sha1加密,再sha1進行MD5加密,生成sign驗籤

Map<String,Object> map = new HashMap<String,Object>(); map.put("phone",phone); map.put("type",type); String sign = SignForIns

純python處理矩陣矩陣進行轉置

方法一 :使用常規的思路 def transpose(M): # 初始化轉置後的矩陣 result = [] # 獲取轉置前的行和列 row, col = shape(

python 2.7在dataframe進行轉置的時候出現字串編碼錯誤(UnicodeEncodeError)

File "D:\Apps\anaconda2.5.2.0\lib\site-packages\pandas\io\formats\format.py", line 611, in to_stri

java下list進行groupby

這兩天碰到個破事,由於提供服務的人不願意提供新介面,只能我在java後臺把原來的list進行加工。網上的方法不是太多就是太low,後來自己琢磨了個簡單點的方法,供大家參考: private void

Pandas建立DataFrame的三種方式

from pandas import Series,DataFrame import pandas as pd 1.使用包含列表的字典建立DataFrame data = {'水果':['蘋

leetcode169

思想: 先將nums通過set()函式找出各不相等的元素item,然後通過nums.count(item)計算每個item的個數並判斷是否大於len(nums)/2,若大於則返回該數。 class Solution: def majorityElement(self, nums):

LeetCode演算法題169解析

給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。 你可以假設陣列是非空的,並且給定的陣列總是存在眾數。 示例1: 輸入: [3,2,3] 輸出: 3 示例2: 輸入: [2,2,1,1,1,2,2] 輸出: 2 這個題可以

Dataframe的解決方法

Pandas在實際使用過程中,遇到如下問題。 有如下一個Dataframe,打算對A的每一個類別求B的眾數,但是不能使用Dataframe.groupby('A').mode(),報如下錯誤。 >>import pandas as pd >>df = pd.Dat