Python_pandas合并数据框操作和python的dict

pandas 合并操作

pandas多种合并操作总结(merge,join,concat,append)
df.join() 相同行索引的数据被合并在一起,因此拼接后的行数不会增加(可能会减少)、列数增加;
df.merge()通过指定的列索引进行合并,行列都有可能增加;merge也可以指定行索引进行合并-可以根据一个或多个键将不同DataFrame中的行连接起来
df.append()在DataFrame的末尾添加一行或多行;大致等价于pd.concat([df1,df2],axis=0,join='outer')。
pd.concat()通过axis参数指定在水平还是垂直方向拼接

类似于
   R语言 数据集的合并:merge,dplyr中的join函数(join为一系列函数,包括:full_join,inner_join,left_join,right_join。)
       cbind,rbind  rbind: 根据行进行合并,就是行的叠加  
   SQL
    left join /inner  join	 
    union all/union
pandas 增删改查
      一、insert()函数 df.insert()
      二、直接赋值法 语法:df[‘新列名’]=新列的值  df.loc[:,新列名]=值
	         df.loc[index名称] = [对应的数据],这个方法要主要index如果是与原表中有重复,则会将原数据修改,如果没有重复的话,就是在最后面添加对应数据
			 df.iloc[index位置] = [对应数据] 进行修改这个方法是对原有数据进行修改,并不是增加一行数据
	  三、reindex()函数 语法:df.reindex(columns=[原来所有的列名,新增列名],fill_value=值)
	  四、concat()函数 原理:利用拼接的方式,添加新的一列。好处是可以同时新增多个列名

python的字典

01.构造
02.字典的访问
  过在方括号内引用其键名来访问字典的 或者  名为 get() 的方法
03.-增删改查 
改       通过引用其键名来更改特定项的值 thisdict["year"] = 2022
     update()	使用指定的键值对字典进行更新
增加项目 使用新的索引键并为其赋值,可以将项目添加到字典中 thisdict["color"] = "red"
    setdefault()	返回指定键的值。如果该键不存在,则插入具有指定值的键。
删除项目 pop() 方法删除具有指定键名的项:popitem() 方法删除最后插入的项目 del 关键字删除具有指定键名的项目 
  del 关键字也可以完全删除字典  clear() 关键字清空字典
查-遍历和索引
统计个数
 result_dict字典用来记录字母出现的次数。 
    第一次出现该键时,创建字典键,将其值设为1, 字典中再次出现该键时,也就是再次出现该字母时,让其值加1。
result_dict = {}
for i in str:
      # 第一次出现该键时,创建字典键,将其值设为1
    if i not in result_dict:
        result_dict[i] = 1
      # 字典中再次出现该键时,让其值加1
    else:
        result_dict[i] += 1
等价于
for i in str:  
    result_dict[i]= result_dict.get(i, 0) + 1

##分组类似-采用了字典和列表的方式  和java类似 用map存起来新的分组后数据
def generate_multi_dict(pairs_list) -> dict:
   f_dict_eg = dict()
   for key_cd, value_cd in pairs_list:
       data = f_dict_eg.get(key_cd)
       if data is None:
           f_dict_eg[key_cd] = []
       f_dict_eg[key_cd].append(value_cd)
   return f_dict_eg 

代码示例

#!/usr/bin/python3
# -*- coding: utf-8 -*- 
import os
import json
import pandas as pd

def parse_json_gt(json_path):
    label_map = {
            'book': 0, 
            'pencil': 0
            }
    all_classes = []
    if  os.path.exists(json_path):
        with open(json_path,"r") as fileobj:
            json_data = json.load(fileobj) 
            for label in json_data["book_labels"]:
                cls = label["book_type"]
                if cls not in all_classes:
                    all_classes.append(cls)
                label_map[cls]= label_map.get(cls, 0) + 1
    return (all_classes,label_map)

def static_detail(gt_path_root):
    all_cls_set =[]
    gt_file_cnt =[]
    grade_file_cnt=[]
    for (dirpath, dirnames, filenames) in os.walk(gt_path_root):
        if dirpath.endswith("grade"):
            pack_nm = os.path.basename(os.path.split(dirpath)[0])
            static_file_path = os.path.join(gt_path_root,pack_nm+".txt")
            with open(static_file_path, 'w', encoding='utf-8') as grade_file_obj:
                for grade_nm in os.listdir(dirpath):
                    if grade_nm.endswith(".json") :
                        static_sig = parse_json_gt(os.path.join(dirpath,grade_nm))
                        gt_file_cnt.append(grade_nm)
                        all_cls_set.extend( static_sig[0])
                        gt_mark ={'book': 0, 'pencil': 0}
                        for martk_label in static_sig[1]:
                            gt_mark[martk_label]= gt_mark.get(martk_label, 0) + static_sig[1].get(martk_label)
                        out_str = ' '.join([str(d) for d in [pack_nm,grade_nm,json.dumps(gt_mark, ensure_ascii=False)]])
                        grade_file_obj.write(out_str + '\n')    
                        print(pack_nm,grade_nm,gt_mark)
            print(static_file_path)
        if dirpath.endswith("class"):
            for class_nm in os.listdir(dirpath):
                if class_nm.endswith(".txt") :
                    grade_file_cnt.append(class_nm)
    print("!> > Total gt json file number : ",len(gt_file_cnt),len(grade_file_cnt))

def static_cnt(gt_path_root):
    gt_file_cnt =[]
    classfile_cnt=[]
    data_df = pd.DataFrame()
    out_pandas = os.path.join(gt_path_root,"static_all.txt")
    for (dirpath, dirnames, filenames) in os.walk(gt_path_root):
        if dirpath.endswith("grade"):
            pack_nm = os.path.basename(os.path.split(dirpath)[0])
            static_file_path = os.path.join(gt_path_root,pack_nm+".txt")
            gt_mark ={'book': 0, 'pencil': 0}
			gt_mid_file_cnt =[]
            for gt_json_name in os.listdir(dirpath):
                if gt_json_name.endswith(".json") :
                    gt_mid_file_cnt.append(gt_json_name)
                    static_sig = parse_json_gt(os.path.join(dirpath,gt_json_name))
                    gt_file_cnt.append(gt_json_name)
                    for martk_label in static_sig[1]:
                         gt_mark[martk_label]= gt_mark.get(martk_label, 0) + static_sig[1].get(martk_label)
            stat_all = 0
            for data in gt_mark:
                    stat_all =stat_all +gt_mark[data]
            #建dataframe对象是也应该是二维数组,再列表外再加一对括号即可        
            data_df=pd.concat([data_df,pd.DataFrame(data=[[pack_nm,len(gt_mid_file_cnt),stat_all]],columns=['pack_nm',"frame_cnt","obj_cnt"])],axis=0)
            print(pack_nm,len(gt_mid_file_cnt),stat_all)
        if dirpath.endswith("class"):
            for class_nm in os.listdir(dirpath):
                if class_nm.endswith(".pcd") :
                    classfile_cnt.append(class_nm)
    print(data_df)
    data_df.to_csv(out_pandas,sep=",",index=False)
    print("!> > Total gt json file number gt and pcd : ",len(gt_file_cnt),len(classfile_cnt))


if __name__ == '__main__':
    path_grade = r"C:\result_check"
    static_data = static_detail(path_grade)
static_data = static_cnt(path_grade)

python的pandas 代码示例

#!/usr/bin/python3
# -*- coding: utf-8 -*- 
import os
import json
import pandas as pd


if __name__ == '__main__':
    static = r"C:\result_check\gt_test.txt"
    static_test = r"C:\result_check\test.txt"

    ###read the data
    stres = pd.read_csv(static,header=0,sep=',')
    test =  pd.read_csv(static_test,header=0,sep=',')
	##check head data
    print(stres.head,test.head)
	## deal
    result = pd.merge(stres, test, how='inner', on=None, left_on="nm", right_on="test_nm",  
      left_index=False, right_index=False, sort=True,   indicator=False)
    ##sum
    print(sum(result.loc[:,"test_frame_cnt"]),sum(result.loc[:,"frame_cnt"]),sum(result.loc[:,"test_obj_cnt"]),sum(result.loc[:,"obj_cnt"]))
    ## Boolean Expressions index ;
    x =result.loc[:,"test_obj_cnt"]-result.loc[:,"obj_cnt"]>0
	### set the display
    pd.set_option('display.max_columns',None)
    pd.set_option('display.max_rows',None)
    pd.set_option('display.width',1000)
    pd.set_option('max_colwidth',1000)
	#show data
    print(result[x])

参考

python 之 列表中字典的分组(三种写法,总有一款适合你) https://blog.csdn.net/a6864657/article/details/126430506    
posted @ 2022-12-08 16:39  辰令  阅读(498)  评论(0编辑  收藏  举报