Python想統(tǒng)計數(shù)據(jù)框中指定的一列數(shù),那么再說函數(shù)的時候,你可以使用if函數(shù)或者是其他的函數(shù)都可以。
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
你好:
我對代碼做了注釋:
#last是一個列表,里面只有一個元素,就是1,說明已經(jīng)運行一次
def?counter(last=[1]):
#last[0]將列表里面的第一個元素取出,然后加1,賦值給next
next?=?last[0]?+?1
#修改列表里面第一個元素的值
last[0]?=?next
#返回此時運行的次數(shù)
return?next
之前用 Python 寫過一個腳本,用來處理上千萬用戶的一些數(shù)據(jù),其中有一個需求是統(tǒng)計用戶的某一數(shù)據(jù)的去重數(shù)量。為了加快程序的速度,我啟用了多進程。但不幸的是,程序跑了近一個星期,還沒處理完。這時,我感覺到了不對,于是開始查看程序的性能瓶頸。
對于統(tǒng)計去重數(shù),我是將用戶的數(shù)據(jù)放到一個列表中,然后用 len(set(data)) 去統(tǒng)計去重數(shù)量。剛開始我以為這的數(shù)據(jù)量并不大,每個用戶的數(shù)據(jù)不會過百,我并沒有注意到有的用戶會有上萬條的數(shù)據(jù),因此消耗了大量的時間(其實我的腳本消耗時間最大的地方是因為從遠程 redis 中取大量數(shù)據(jù)時發(fā)生長時間的阻塞,甚至連接超時,最后我采用的方式分而治之,每次取少量的數(shù)據(jù),這樣大大的提高了性能)。
為了做優(yōu)化,我開始尋求高效的方法。我發(fā)現(xiàn),有大量的人認為采用字典效率會更高,即:
data_unique = {}.fromkeys(data).keys() len(data_unique)
于是,我做了下測試:
In [1]: import random In [2]: data = [random.randint(0, 1000) for _ in xrange(1000000)] In [3]: %timeit len(set(data)) 10 loops, best of 3: 39.7 ms per loop In [4]: %timeit len({}.fromkeys(data).keys()) 10 loops, best of 3: 43.5 ms per loop
由此可見,采用字典和采用集合的性能是差不多的,甚至可能還要慢些。
在 Python 中其實有很多高效的庫,例如用 numpy、pandas 來處理數(shù)據(jù),其性能接近于 C 語言。那么,我們就用 numpy 和 pandas 來解決這個問題,這里我還比較了獲取去重數(shù)據(jù)的性能,代碼如下:
import collections import random as py_random import timeit import numpy.random as np_random import pandas as pd DATA_SIZE = 10000000 def py_cal_len(): data = [py_random.randint(0, 1000) for _ in xrange(DATA_SIZE)] len(set(data)) def pd_cal_len(): data = np_random.randint(1000, size=DATA_SIZE) data = pd.Series(data) data_unique = data.value_counts() data_unique.size def py_count(): data = [py_random.randint(0, 1000) for _ in xrange(DATA_SIZE)] collections.Counter(data) def pd_count(): data = np_random.randint(1000, size=DATA_SIZE) data = pd.Series(data) data.value_counts() # Script starts from here if __name__ == "__main__": t1 = timeit.Timer("py_cal_len()", setup="from __main__ import py_cal_len") t2 = timeit.Timer("pd_cal_len()", setup="from __main__ import pd_cal_len") t3 = timeit.Timer("py_count()", setup="from __main__ import py_count") t4 = timeit.Timer("pd_count()", setup="from __main__ import pd_count") print t1.timeit(number=1) print t2.timeit(number=1) print t3.timeit(number=1) print t4.timeit(number=1)
運行結(jié)果:
12.438587904 0.435907125473 14.6431810856 0.258564949036
利用 pandas 統(tǒng)計數(shù)據(jù)的去重數(shù)和去重數(shù)據(jù),其性能是 Python 原生函數(shù)的 10 倍以上。
分享文章:頻次統(tǒng)計函數(shù)python,頻率統(tǒng)計方法
本文鏈接:http://vcdvsql.cn/article20/hsjjco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、服務(wù)器托管、企業(yè)網(wǎng)站制作、搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)