• Python_pandas处理数据格式和统计频次


    Pandas 数据处理

    Pandas 数据预处理--格式问题
    

    知识点说明

      读入和写出
      结构化数据--处理-清洗-变换
       enumerate zip sorted reversed
    import numpy as np   
     Numpy -- ndarray  --数组计算框架 np.array -- 向量化运算  数组的切片、数组子集-视图--对视图的修改会影响到原数组
         显式的拷贝--.copy()
    	 切片--视图
    	 整数索引 布尔索引 -- 整数索引-整数数组(传递所需的列表或数组)--将数据复制到新的数组  --同质型数值类
    import pandas as pd
    pandas
      Serirs DataFrame
      Serirs--值序列(value)和索引(index)  索引name  
    loc切片的行索引和列索引的索引名,
    iloc中传入需要切片的行索引和列索引的数值索引范围 左闭右开的(包含起始值,不包含结束值)    
        整数索引   布尔索引  name索引
    	轴-- axis 0为行向  1为列向
    	
    	拼接和合并
    	  pd.concat() 行列拼接
    	  pd.merge()  索引-列-关联
    	
    	重构和透视
    	  statck unstack
    	  pd.piovt  pd.melt
    	
    	分组
    	  groupby 分组聚合--聚合函数和自定义聚合函数aggregate 
        
    	其他
    	  cut  qcut pivot_table pd.crosstable
    	  
    	时间序列
    	  shift
    

    代码示例

    import os
    import sys
    import pandas as pd
    
    if __name__ == '__main__':
        input_dir_nm= r"F:\testdata\test.txt"
        out_rst_file = r"F:\testdata\test-stat.txt"
        #input_dir_nm = sys.argv[1]
    	## 读入数据
        res = pd.read_csv(input_dir_nm,header=None,sep=',',names=['student_id','subject','score'])
        print(res.info())
    	## 分组统计
        res_cnt = res.groupby(['student_id','subject'],as_index=False).size()
        print(res_cnt)
    	## 数据形式变换
        res_cnt = pd.pivot(res_cnt, index="student_id", columns="subject", values="size")
    	## 重命名和填充
        res_cnt_df = res_cnt.rename_axis(columns=None).reset_index().fillna(0)
        print(res_cnt_df)
        # 一列分为多列
        key_id_df = res_cnt_df['student_id'].str.split('/', expand=True)
        # 选取其中两列,并重新命名-将旧列名称指定为键,将新名称指定为值
        key_id_df   = key_id_df.iloc[:, [4,6]].rename(columns={4:'base_nm',6:'age_id'})
        print(key_id_df)
        # 两个dataframe 按照列合并-(df1,df2左右拼接)
        lst_f = pd.concat([key_id_df,res_cnt_df],axis=1)
        print(lst_f)
        ## 输出
        lst_f.to_csv(out_rst_file,index=0)
    
    
        # res_cnt_df = res_cnt.set_index(["student_id", "subject"])
        # two_level_index_series = res_cnt_df["size"]
        # result_df = two_level_index_series.unstack().rename_axis(columns=None).reset_index()
        # print(result_df)
    

    使用传统的

    使用 defaultdict 进行统计
    

    代码示例

    from collections import defaultdict
    
    def get_sig_stat(student_file):
        # d=defualt(),括号中的参数可选[int,set,list]中的一个
        mark_labels = { 'chinese': 0,  'math': 0,  'history': 0, 'biology': 0, 'physics': 0, 'politics': 0,  }
        pair_d = defaultdict(list)
        result = list()
        with open(student_file, encoding="utf-8") as f:
            for file_num, in_data in enumerate(f):
                in_data = in_data.split(",")
                #img_id = data[0].split("/")[-1].strip()
                img_id = in_data[0].strip()
                kind_type = in_data[1].strip()
                pair_d[img_id].append(kind_type)
            for unique_nm ,values in pair_d.items():
                category_d = defaultdict(int)
                for kind_data in values:
                    category_d[kind_data] +=1
                for type_nm ,type_cnt in  mark_labels.items():
                    if type_nm in  category_d.keys() :
                        mark_labels[type_nm]= category_d.get(type_nm)
                result.append((unique_nm,mark_labels))
        return  result
    if __name__ == '__main__':
        input_dir_nm= r"F:\testdata\test.txt"
        rd = get_sig_stat(input_dir_nm)
        for ad in rd:
            print(ad)
    

    参考

    pandas行转列、列转行、以及一行生成多行  http://www.manongjc.com/detail/14-njxofzmjxqmpvnq.html
    pandas取出某两列 https://blog.csdn.net/qq236237606/article/details/112320935
    Python中的defaultdict方法  https://blog.csdn.net/weixin_44500833/article/details/104944980
  • 相关阅读:
    mybatis中的延迟加载
    MyBatis的mapper
    MyBatis的resultMap
    mybatis入门
    mybatis中的#和$的区别(转)
    操作日志记录
    SpringMVC中的异常处理集锦
    vue.js的package.json相关问题解惑
    git的常用操作指令
    http协议参数详解
  • 原文地址:https://www.cnblogs.com/ytwang/p/16249723.html
Copyright © 2020-2023  润新知