# -*- 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)