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
标签:cnt,nm,Python,res,pandas,--,df,数据格式,id 来源: https://www.cnblogs.com/ytwang/p/16249723.html