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
能夠接用外部函式,搜尋網上的解決辦法,經過嘗試,在此總結並列出以下幾種解決方案(當然也可以直接跳到最後一個解決方案)。
使用
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
使用
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
使用
pd.Series.mode()
:該函式是返回Series
的眾數的,當眾數有多個時,會返回一個list
,裡面包含了所有眾數>>> df.groupby('a').agg(pd.Series.mode).reset_index() a b 0 A 1 1 B [2, 3]
使用
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
相關推薦
pandas:對dataframe進行groupby後求眾數mode
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