pandas统计数据-json转list,拼接列表实现dataframe

调查问卷,根据答案统计,数据库保存方式为json的字符串

需求:APP里面的调查问卷,已经正式运营一周,老板要一份调查问卷的统计,依据题目,答案统计数目和所占百分比

分析:数据保存方式,所有用户提交内容保存一个json的字符串,现在要对里面每个字段进行统计

数据如下:
在这里插入图片描述

方案一:利用PHP,获取jstext的结果集,根据题目,循环拼接,对应字段字符串,该字符串包含用户答案,根据答案查找出现次数,即为选择该答案的数量

	public function testques(){
        $res = Db::name('question')->field('jstext')->select();
        $arr=[];
        $age_1=0;
        $age_2=0;
        foreach ($res as $k=>$v){
            $json = $v['jstext'];
            $jsarr = json_decode($json,true);
            if(!empty($jsarr)){
                if($jsarr['age']==1){
                    $age_1+=1;
                }else{
                    $age_2+=1;
                }
                //以此类推,将所有答案循环自增统计
            }
        }
        echo $age_1;
        echo $age_2;
    }
    

方案二:利用python,直接读取数据库,将结果集中json的字符串,转为列表,json的字段名设置为df的列名

注意:pymysql得到的是元祖,需要将结果集遍历,区元祖的第一个值,转接为json。dataframe的列就是这个json的key,数据就是json的值的集合。另外,多选答案的统计,需要str.contains包含指定答案来统计。
import  pandas  as pd
import xlrd
import pymysql
import json
import xlwt
from datetime import datetime
import numpy as np

def getdata(sql='select a.jstext from fcxlt_question as a left join fcxlt_jjr_member as b on a.member_id=b.id where b.role>3'):
    conn = pymysql.connect(host='127.0.0.1',user='root' ,passwd='root',db='cmf',port=3306,charset='utf8')
    cur = conn.cursor()
    cur.execute(sql)
    result = cur.fetchall()
    cur.close()
    conn.close
    return result

def radio(var,df):
    size = df.groupby(var).size()
    print(size)
    for i in enumerate(size):
        print(i/df[var].count())
def morecheck(var,df,str):
    dfnew = df.copy()
    dfnew[var].fillna('', inplace=True)
    sa= dfnew[var].str.contains(str)
    count = df.iloc[:,0].size
    print("{}包含{}".format(var,str))
    print(dfnew[sa].commonfun.count())
    print(dfnew[sa].commonfun.count()/count)        

def main():
    # 获取结果集
    s = getdata()
    mylist = []
    # 重组数据,设置df的行和列
    for v in s:
        vs = json.loads(v[0])#str转json
        lst2 = list(vs.values())#获取json的值
        mylist.append(lst2)#将所有json的值追加到mylist的列表组成df的行
        colum = list(vs)#df的列,即为json的字段名
    df = pd.DataFrame(mylist,columns=colum)
    # count = df.iloc[:,0].size 总行数
    # df = df.fillna('', inplace=True)
    print(df.head())
    #单选统计
    radio('sex',df)
    radio('age',df)
    radio('year',df)
    radio('frequency',df)
    radio('feel',df)
    print("*"*100)
    morecheck('commonfun',df,'1,')
    morecheck('commonfun',df,'2,')
    morecheck('commonfun',df,'3,')
    morecheck('commonfun',df,'4,')
    morecheck('commonfun',df,'5,')
    morecheck('commonfun',df,'6,')
    morecheck('commonfun',df,'7,')

if __name__=='__main__':
    main()

在这里插入图片描述

备注:导出详细数据,df.to_csv(‘detail.csv’)既可

结果:在这里插入图片描述

发布了62 篇原创文章 · 获赞 11 · 访问量 8094

猜你喜欢

转载自blog.csdn.net/u013252962/article/details/100697529
今日推荐