天天看點

python筆記14:資料處理之随機抽樣

# -*- coding: utf-8 -*-

#1. 概念:随機抽樣,是指随機從資料中,按照一定的行數或者比例抽取資料

#随機抽樣函數:DataFrame.sample(n,frac,replace=False)

#n:按個數抽樣

#frac:按百分比抽樣

#注:以上兩個參數隻能任意設定一個

#replace:是否可放回抽樣,預設為False不可放回(所謂能否放回即被抽取過的資料還能不能被再次抽取)

#傳回值:抽樣後的資料框

import numpy

import pandas

df = pandas.read_csv('D:/workspaces/python/pythonStudy/14.csv')

#設定随機種子

numpy.random.seed(seed=2)

#按照個數抽樣

df.sample(n=10) #随機抽取10條記錄

#按照百分比抽樣

df.sample(frac=0.02) #抽取百分之二的資料

df.sample(n=10,replace=True) #可放回的随機抽樣

#分組抽樣:

gbr = df.groupby("class")  #按班級分組

gbr.groups #得到所有的分組字典。每一組的成員是各行的索引

#基于上述知識:

#1. 按個數進行分組抽樣:

#使用字典定義抽樣方式:1班中抽2個人,2班抽4個人,3班抽6個人

typicalNDict = {

                1:2,

                2:4,

                3:6                

                }

def typicalSampling(group,typicalNDict):      

    #print("test");

    name = group.name   

    print (name)

    n = typicalNDict[name]

    tempresult = group.sample(n=n)

    print (tempresult)

    return tempresult

result = df.groupby('class',group_keys=False).apply(typicalSampling,typicalNDict)  

#通過typicalSampling方法中列印的測試方法可以看到,該方法一共被調用了三次(因為一共得到了三個分組DataFrame),result的最終結果是三次調用結果的并集

#注:實際上typicalSampling會調用4次,通過在方法的第一行列印一些内容就可以看到,官方解釋:apply在第一列/行上調用func兩次,以決定是否可以進行某些優化http://www.cnblogs.com/wkang/p/10150401.html

#奇怪的是:如果不在name = group.name之前列印内容,就看不出方法調用了4次

#2.使用百分比進行分組抽樣:

typicalFracDict = {

                   1:0.2,

                   2:0.4,

                   3:0.6                   

                   }

def typicalSampling(group,typicalFracDict):

    name = group.name

    frac = typicalFracDict[name]

    return group.sample(frac=frac)

result = df.groupby('class',group_keys=False).apply(typicalSampling,typicalFracDict)