使用python-Pandas剔除问卷调查中的无效样本示例

做问卷是一件头疼的事,发问卷出去让别人填结果别人乱填对自己分析问卷信息更是一件头疼的事。那该如何避免因为这些乱填的问卷影响问卷效果呢?下面我们从一个朋友让我帮他处理问卷的例子谈一下该如何使用pandas如何筛选删除那些没用的数据。

1. 剔除无效样本准则

一般而言,缺失数据达到10%以上或呈现规律规律作答即可将该样本视为无效样本。结合经验按照以下3个原则剔除无效样本:

  • 如果出现10%及以上题目未作答,就视为无效作答
  • 连续选择某一个选项达10%及以上的测试作答被视为无效作答
  • 顺序作答(如A、B、C、D、E)重复两次及以上的测试作答被视为无效作答

下面我们将通过一个例子使用pandas将不合格的问卷剔除

2.上代码

2.1 筛选出如果出现10%及以上题目未作答,就视为无效作答
# 读取数据
import pandas as pd
path = r'D:\FileStorage\File\2020-12\某某调查问卷.xlsx'
pre_data = pd.read_excel(path)

#计算数据每行中出现空值的次数——用sum_NaN表示
pre_data['sum_NaN']=pre_data.isnull().T.sum()
pre_data.shape

(24291, 100)

# 删除缺失值超过10%未作答的数据——即,sum_NaN>=(66+28)*10%, 即sum_NaN > 9
pre_data = pre_data.drop(pre_data[(pre_data.sum_NaN > 9)].index)
pre_data.shape

(24117, 100)
由此可见排除的数量为24291-24117 = 174条数据

2.2 使用pandas自带的正则表达式方法剔除满足2、3准则的数据

问卷答题从第6列到倒数第二列,因此为了方便筛选,将每一个调查问卷的问答数据列转化为字符串后,进行合并,最后只需要使用正则表达式匹配出这些无用数据,进行删除即可。

# 先将每一行中所有的问卷答案合并为新的一列
data['str_sum_answer'] = data['q1'].map(str)
for i in range(6,len(data.columns)-1):
    data['str_sum_answer'] +=  data[data.columns[i]].map(str)

# 进行正则匹配
# 正则匹配规则:.*[i]{9,},其中i = 0-9中的某一个数 
sub_data = data[data.str_sum_answer.str.match('.*[1]{10,}')]
for i in range(2,10):
    regulation = '.*['+str(i)+']{10,}' # 正则匹配规则
    sub_data1 = data[data.str_sum_answer.str.match(regulation)]
    sub_data = sub_data.append(sub_data1)
data1 = data.drop(sub_data.index) # 通过索引的方式删除选出来的行

# 同理匹配选择ABCDEABCDE即1234512345的调查问卷
re2 = '.*1234512345'
sub_data2 = data1[data1.str_sum_answer.str.match(re2)]
data2 = data1.drop(sub_data2.index)
# data2.shape # 由此可见处理后还有23954列数据 
data2.to_excel("处理后的数据.xlsx") # 将数据导出

由于作者才疏学浅,如果正则匹配这里有更不错的方式也欢迎留言学习

猜你喜欢

转载自blog.csdn.net/weixin_45915507/article/details/112439445