【发布时间】:2019-03-12 10:48:48
【问题描述】:
我正在创建一个简单的代码,当您的目标变量具有 2 个以上的类时,它允许对数据帧进行下采样。
让df 是我们的任意数据集,'TARGET_VAR' 是一个具有 2 个以上类别的分类变量。
import pandas as pd
label='TARGET_VAR' #define the target variable
num_class=df[label].value_counts() #creates list with the count of each class value
temp=pd.DataFrame() #create empty dataframe to be filled up
for cl in num_class.index: #loop through classes
#iteratively downsample every class according to the smallest
#class 'min(num_class)' and append it to the dataframe.
temp=temp.append(df[df[label]==cl].sample(min(num_class)))
df=temp #redefine initial dataframe as the subsample one
del temp, num_class #delete temporary dataframe
现在我想知道,有没有办法以更精致的方式做到这一点?例如无需创建临时数据集? 我试图找出一种方法来“矢量化”多个类的操作,但没有得到任何结果。以下是我的想法,可以轻松实现 2 个类,但我不知道如何将其扩展到多个类的情况。
如果您有 2 个类,这将非常有效
df= pd.concat([df[df[label]==num_class.idxmin()],\
df[df[label]!=num_class.idxmin()].sample(min(num_class))])
这允许您为其他类选择正确数量的观察值,但这些类不一定具有同等的代表性。
df1= pd.concat([df[df[label]==num_class.idxmin()],\
df[df[label]!=num_class.idxmin()].sample(min(num_class)*(len(num_class)-1))])
【问题讨论】:
标签: python pandas downsampling