• pandas day02


    Pandas 排序

    # serious 排序
    df['score'].sort_values(ascending=false)
    
    # dataframe 单列排序
    df.sort_vaules(by='score')
    df.sort_values(by='score',ascending=fales)
    
    # dataframe 多列排序
    df.sort_values(by=['score','name'],ascending=[fales,true],inplace=false)
    
    

    pandas 字符串处理

    # 使用原则
    1. 使用方法:先获取series的str属性,然后在属性上调用函数
    2. 只能在字符串列上使用,不能数字列使用函数
    3. dataframe 上没有str的属性和处理方法
    4. series.str不是python原声字符串,但相似
    
    # 使用方法: series.str.[func]
    
    # 多次str处理的链式操作
    df['ymd'].str.replace('-','').str.slice(0,6)
    df['ymd'].str.replace('-','').str[0:6]
    
    # str 对正则表达的处理
    def add_new(x):
        year,month,day = x['ymd'].split('-')
        return f'{year}年{month}月{day}日'
    df['中文日期'] = df.apply(add_new,axis=1)
    
    # 去掉年月日
    df['中文日期'].str.replace('年','').str.replace('月','').str.replace('日','')
    
    df['中文日期'].str.replace('[年月日]','')
    

    pandas 的axis 参数理解

    # axis=0 or 'index'
    单行操作,指某一行
    聚合操作,指跨行cross rows
    
    # axis=1 or 'colums'
    单列操作,指某一列
    聚合操作,指跨行cross columns
    
    # 删除列
    df.drop['A',axis=1]
    # 删除行
    df.drip[1,axis=0]
    
    # 平均值
    df.mean(axis=0) # 最终变成一行
    df.mean(axis=1) # 最终变成一列
    

    pandas 索引index

    # index 用途
    1. 更方便的数据查询
    2. 查询性能提升
    3. 自动的数据对其功能
    4. 更多更强大的数据结构支持
    
    # 修改索引
    df.set_index('useridID',inplace=True,drop=False)
    # 查看index
    df.index
    # 使用index 查询
    df.loc[df['userID']==500].head(5)
    df.loc[500].head(5)
    
    # index 提升性能
    1. 如果index唯一,pandas使用哈希表优化,O(1)
    2. index不唯一,但有序,pandas使用二分查找, O(logN)
    3. index 随机, 全表扫描, O(N)
    
    # index 能自动对齐数据
    s1 + s2 会把index 相同的进行相加
    
    # index支持更多数据结构
    1. categoricalIndex 基于分类的index,提升性能
    2. multiIndex 基于groupby多位聚合后的结果
    3. datetimeIndex, 时间类型索引
    
    # index 方法
    1. index 是否递增
    df.index.is_monotonic_increasing
    2. index是否唯一
    df.index.is_unique
    3. 将index排序
    df.sort_index()
    
    
    

    pandas 合并 merge

    # merge grammer
    pd.merge(left,right,how='inner',on='aa',left_on='bb',right_on='cc',left_index=false,right_index=false,sort=true,suffixes=['_x','_y'])
    
    # merge three file
    
    1. read three files
    df_file01 = pd.read_csv(
    'file_paht',sep='::',engine='python',
    name='userid::movieid::rating::timestamp'.split('::'))
    
    2. merge
    # inner: 两边都有数据保留,否则丢弃
    df_new = pd.merge(df01,df02,left_on='movieid',right_on='movieid',how='inner')
    
    # 理解merge数量对齐关系
    1. one-to-one 一对一关系,关联的key 唯一
    2. one-to-many
    3. many-to-many   
    
    # left,right,inner,
    left: 保留左表所有数据
    right:保留右表所有数据
    inner: 保留两表交集
    outer join:并集
    
    # 处理非key 字段重名
    pd.merge(left,right,on='key',suffixes=['_left','_right'])
    

    pandas 数据合并 concat

    #concat 语法
    pandas.concat(objs,axis=0,join='outer',ingnore_index=false)
    
    # appdend 按行合并
    dataframe.append(other,ingonre_index=false)
    other: 单个dataframe,series,dict or list
    ignore_index: 是否忽略原来的数据索引
        
    # 使用concat添加列
    pd.concat([df,s1],axis=1) # single line
    s = df.apply(lambda x:x['A']+'_aa',axis=1)
    pd.concat([df,s1,s2],axis=1) # multiple line
    
    pd.concat([s1,s2],axis=1) # 列表只有series
    
    pd.concat([s1,df1,s2],axis=1) # 列表可以混合顺序
    
    
    # append 按行合并数据
    1. 给打他frame添加一个dataframe
    df1.append(df2,ignore_index=false)
    
    2. 一行一行给dataframe添加数据
    # 创建空的dataframe
    df = pd.DataFrame(columns=['A'])
    # 低性能创建
    for i in range(5):
        df = df.append(['A',i],ingore_index=true)
        
    # 高性能版本
    pd.concat(
    [pd.DataFrame[i],columns=['A'] for i in range(5)], ignore_index=true
    )
    
    

    Pandas 批量拆分和合并Excel

    # 大excel拆成多个,分配给不同的人
    使用df.iloc将搭的df拆成多个df
    
    1. 计算没人行数
    users = ['a','b','c']
    slit_size = row_count // len(users)
    if row_count % len(users) != 0:
        split_size += 1
        
    2. 拆分excel
    df_subs = []
    for i, user in enumerate(users):
        begin = i * split_size
        end = begin + split_size
        
        df_sub = df_source.iloc[begin:end]
        df_subs.append((i,user,df_sub))
        
    3. 存入excel
    for i ,user, df_sub in df_subs:
        file_name = f'aa{user}'
        df_sub.to_excel(file_name,index=false)
    
    # 多个小的excel 合并成一个大的
    1. 遍历文件夹,获取要合并的excel列表
    2. 分别去读到dataframe,给每个df加一列标记源
    3. concat进行合并
    
    excel_names = []
    for excel_name in os.listdir(dir):
        excel_names.append(excel_name)
        
    df_list = []
    for i in excel_names:
        to_path = f'{splits_dir}/i'
        df_split = pd.read_excel(i)
        
        username = i.replace('前缀','').replace('后缀','')[2:]
        
        df_split['username'] = username
        df_list.append(df_split)
        
    df_merge = pd.concat(df_list)
    df_merge.to_excel('path',index=false)
    

    pandas实现groupby分组统计

    # 分组使用聚合函数做数据统计
     
    1. 单个列groupby
    df.groupby('a').sum() # 非数字列自动忽略
    
    2. 多个列groupby
    df.groupby(['a','b'],as_index=false).mean()
    
    3. 同时查看多种数据统计
    df.groupby('a').agg([np.sum,np.mean,np.std])
    
    4. 查看单列的数据统计结果
    df.groupby('a')['c'].agg([np.sum,np.mean,np.std]) 
    
    5. 不同的列使用不同的聚合函数
    df.groupby('a').agg({'c':np.sum,'d':np.mean})
    
    # 具体分析groupby 
    g = df.groupby('a')
    for name,group in g:
        print(name)
        print('group is a dataframe')
        
    取单个分组的数值
    g.get_group('bar')
    

    Pandas 分层索引multiindex

    分层索引:在一个轴向上拥有多个索引层级,可以表达更高维度数据形式
    方便进行数据筛选,有序性能更好
    groupby, 如果是多key, 结果为分层索引
    
    # series 多层索引multiindex怎么筛选数据
    ser.loc['baidu']
    ser.loc[('baidu','2021' )]
    ser.loc[:,'2021']
    
    # dataframe 多层索引筛选数据
    1. 元组表示筛选多层索引,一级索引,二级索引
    2. 列表代表同一层的多个key
    
    stockes.loc[(['baidu','jingdong'],'2029'),:]
    筛选一级索引所有内容
    stocks.loc[(slice(None),['2019','2021']),:]
    
    # 多级索引变成普通的列
    stocks.reset_index()
    

    pandas 的数据转换函数

    map, apply, applymap

    1. map:只用于series,实现每个值到值得映射
    2. apply: 用户series实现每个值得处理, 用于dataframe 实现每个轴得series处理
    3. applymap: 只能用户dataframe, 用于处理dataframe的每个元素
     
    ### map 
    方法一: Series.map(dict)
    # 股票代码英文转换成中文
    dict_company_names = {
        'baba':'阿里巴巴'
    }
    
    stocks['chinese name'] = stocks['gongsi'].str.lower().map(dict_company_names)
    
    方法二: Series.map(func)
    stocks['chinese name'] = stocks['gongsi'].map(lambda x: dict_company_names[x.lower()])
    
    ### apply 
    Series.apply(func) 函数参数为每个值
    DataFrame.apply(func) 函数参数为Series
     
    stocks['chinese name'] = stocks['gongsi'].apply(lambda x: dict_company_names[x.lower()])
    
    stocks['chinese name'] = stocks.apply(lambda x: dict_company_names[x['gongsi'].lower()],axis=1)
    
    ### applymap
    用于dataframe中所有值得转换
    sub_df = stocks[['开盘','收盘']]
    
    stocks[:,['开盘','收盘']] = sub_df.applymap(lambda x: int(x))
        
    

    pandas 怎么对分组应用apply 函数

    pandas 方法总结

    # 查看行数,列数
    df.shape #(258,3)
    
    # 去重
    df['公司'].unique 
    
    # 总行数
    df.count()
    
    # 计时查询ID==500 数据的性能
    %timeit df.loc[500]
    
    # 拥有二级索引的series转换成dataframe
    ser.unstack()
    
    # 重建索引
    ser.reset_index()
    
  • 相关阅读:
    洛谷 P1443 马的遍历 BFS
    洛谷 P1583 魔法照片 快排
    洛谷 P1093 奖学金 冒泡排序
    洛谷 P3811 【模板】乘法逆元 如题
    洛谷 P3384 【模板】树链剖分 如题
    洛谷 P3379 【模板】最近公共祖先(LCA) 如题
    vijos 信息传递 tarjan找环
    洛谷 P3373 【模板】线段树 2 如题(区间加法+区间乘法+区间求和)
    酒厂选址
    ⑨要写信
  • 原文地址:https://www.cnblogs.com/Afrafre/p/15913395.html
Copyright © 2020-2023  润新知