zoukankan      html  css  js  c++  java
  • pandas

    import pandas as pd
    import numpy as np
    pandas 打开多个sheet
    '''
    df_names = pd.ExcelFile('text.xlsx') 打开工作薄
    print(df_names.sheet_names) 打印sheet列表

    for i in df_names.sheet_names:
    new_df = pd.read_excel('text.xlsx',i) 循环打开工作表
    print(new_df)
    '''

    新建文件
    data = pd.DataFrame({'序号':[1,2,3],'姓名':['张三','李四','王五']})
    data.set_index('序号') 设置 索引 不用pandas自带的索引
    data.to_excel('路径.xlsx')

    读取文件
    path = '路径.xlsx'
    data = pd.read_excel(path,header=None,names=['姓名','年龄','日期',],index_col='日期',
    nrows=None)
    其他文本格式的分割符可能是 ,。 可以在参数里添加sep=','表示以什么分割
    还可以 用正则来匹配
    haeder和names 需要配合使用 只使用header 列名会变成0 1 2 3 4
    index_col['',''] 索引列 可以有多个
    skiprows=[2,3] 跳过索引行
    encoding 参数 字符编码格式
    nrows=3 默认5行 想读取的行数

    一下 都是累属性 不用加括号
    data.head(3) 默认是5行数据 最好写到参数里
    data.shape 返回多少行 多少列
    data.columns 列名 第一行数据
    data.index 索引 返回元组(start,end,step(步长))
    data.dtypes 数据类型

    保存数据
    data.to_excel(path) 在读取数据或处理完数据后 保存数据
    在保存数据的格式 需要在读取数据的时候都设置好
    如 索引 表头等格式

    数据结构
    DataFranme 二维数据 整个表格 多行多列
    df.index 索引列
    df.columns 列名
    Series 一维数据 一行或一列

    Series
    data = pd.Series(['张三','李四','王五','赵六'],index=['A','B','C','D'])
    是由 索引列 和数据列组成
    index 指定索引列

    字典创建series
    dic = {'姓名':'张三','性别':'男','年龄':'18'}
    data = pd.Series(dic)
    key 是索引
    value 是数据
    data['姓名'] 拿到数据
    data[['姓名','性别']] 拿到多个数据

    list_1 = [1,2,3]
    list_2 = ['a','b','c']
    data = pd.Series(list_2,index=list_1)
    想设置谁是索引 就把谁 放到index里
    data.values 查值


    DataFranme
    data = pd.read_excel('路径.xlsx',index_col=None)
    df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['a','b','c'])
    data.sort_index('性别') 排序 默认按索引 可以自己设置
    data.isnull('性别') 是否为空 不空=True
    data.notnull('性别') 不为空
    print(df)
    print(df[['a','b']]) a列0行 单列和多列查询
    print(df.loc[[0,1]][['a','b']]) 使用属性拿取 可以单、多列单、多行 推荐
    print(df.iloc[0][0]) 全用下标 表示

    字典创建DataFranme
    dic = {
    '姓名':['张三','李四'],
    '性别':['男','女'],
    }
    df = pd.DataFrame(dic)
    print(df) key是列索引 值是数据
    '''
    姓名 性别
    0 张三 男
    1 李四 女
    '''
    print(df.dtypes) 每列的类型
    print(df.columns) Index(['姓名', '性别'], dtype='object')
    print()
    print()
    print()

    多个Series创建DataFrame
    Series_1 = pd.Series(['张三','李四','王五'],index=[[1,2,3]],name='姓名')
    Series_2 = pd.Series(['男','女','男'],index=[[1,2,3]],name='姓别')
    Series_3 = pd.Series([22,23,24],index=[[1,2,3]],name='年龄')
    data = pd.DataFrame({Series_1.name:Series_1,
    Series_2.name:Series_2,
    Series_3.name:Series_3}
    )
    data = pd.DataFrame([Series_1,Series_2,Series_3])
    data_1 = pd.DataFrame([[5,6,7],[7,8,9]],columns=[[1,2,3]],index=['性别','姓名'])
    print(data_1)
    print('*'*30)
    print(data)
    print('*'*30)
    print(data.join(data_1,how='left',lsuffix='_l',rsuffix='_r'))
    使用join 必须 添加后面的2个参数 join方法 不好用
    报错columns overlap but no suffix specified: MultiIndex([(1,)
    ''' 字典形式的Series
    姓名 姓别 年龄
    1 张三 男 22
    2 李四 女 23
    3 王五 男 24
    列表形式的Series
    1 2 3
    姓名 张三 李四 王五
    姓别 男 女 男
    年龄 22 23 24
    相当于 旋转了90度
    行和列兑换了位置
    DataFrame上面有数据对齐功能 索引不一样 会导致空会NaN表示

    DataFrame常用方法
    数据.head( 5 ) 查看前5行
    数据.tail( 3 ) 查看后3行
    data.values 查看数值
    data.shape 查看行数、列数 shape模型;身材;具体化
    data.fillna(0) 将空值填充0 可以更换成其他值
    data.replace( 1, -1) 将1替换成-1
    data.isnull() 查找数据中出现的空值
    data.notnull() 非空值
    data.dropna() 删除空值
    data.unique() 查看唯一值
    data.reset_index(drop=True删除索引、False转为普通数据列) 修改、删除,原有索引,详见例1
    data.columns 查看数据的列名
    data.index 查看索引
    data.sort_index() 索引排序
    data.sort_values() 值排序
    pd.merge(数据1,数据1) 合并
    pd.concat([数据1,数据2]) 合并,与merge的区别,自查
    pd.pivot_table( 数据 ) 用df做数据透视表(类似于Excel的数透)
    '''

    连接查询 数据合并与重塑
    Merge
    pd.merge(数据1,数据2,on=指定连接字段,how='inner、left、right、outer')
     on=指定连接字段 需要链接的字段
    how='inner、left、right、outer' 选择连接方式

    多字段连接
    pd.merge(数据1,数据2,on=[字段1,字段2],how='inner、left、right、outer')
    两个表 表1有1个张三 表2有2个张三 那么会认为是相同的人
    默认张三在连表中是同一个数据 所以自动填补缺失数据 请看下面示例
    '''
    表1 表1
    张三 1 张三 1
    张三 2
    连表 出现_x 出现_y
    张三 1 1
    张三 1 2 这里前面的1 就是自动添加的
    因为同一个人 前面没有数据 自动补全
    '''

    直接字段和索引进行连接
    pd.merge(数据1,数据2,left_on=字段,right_index=索引列,how='outer')
    同上 会自动补全

    join 不指定on 字段是按索引进行连接 指定on 按列连接
    data_1.join(data_2,on=字段) 2表连接
    data_1.join([data_2,data_3],on=字段) 多表连接
    print(data.join(data_1,how='left',lsuffix='_l',rsuffix='_r'))
    使用join 必须 添加后面的2个参数 join方法 不好用
    报错columns overlap but no suffix specified: MultiIndex([(1,)

    concat
    '''
    concat(objs,
    axis=0,
    join='outer',
    join_axes=None, 根据那个轴 指定对齐 join_axes=[df.index]
    ignore_index=False, 无视index的concat ignore_index=True
    keys=None, 来自于那张表 keys = ['x','y','z']
    levels=None,
    names=None,
    verify_integrity=False,
    sort=None,
    copy=True)
    '''
    np_data = pd.DataFrame(np.arange(9).reshape(3,3),)
    print(np_data)
    df_data = pd.concat([np_data,np_data],axis=1) 轴的方向
    print('*'*30)
    print(df_data)
    '''
    0 1 2
    0 0 1 2
    1 3 4 5
    2 6 7 8
    ******************************
    0 1 2
    0 0 1 2
    1 3 4 5
    2 6 7 8
    0 0 1 2
    1 3 4 5
    2 6 7 8
    '''
    从上面例子可以看出 都是合并 不过就是合并到 右边或下边

    append
    默认沿着列凭借(axus = 0 列对齐)
    reseult = df1.append(df2)
    append方法 是内置的方法 不是concat的方法
    可以讲series和字典 作为DataFrame的新的一行
    reseult = df1.append(df2,ignore_index=True)
    就是一列数据给 横着放到原数据的最后一行
    表格字段不同的表 合并
    reseult = df1.append(df2,ignore_index=True)

    应用第一是concat 第二 merge 第三 join不太用

    各种数据自动填充
    '''
    pd.read_excel参数:
    skiprows=行数 跳过几行
    usecols="区域" 和Excel中一样,就是一个列的区域 选择需要的区域
    index_col="字段名" 将谁设置为索引
    dtype={'序号':str,'性别':str,'日期':str} 防止出错,把类型全指定为字符型
    数据.at的用法
    作用:获取某个位置的值,例如,获取第0行,第a列的值,即:index=0,columns='a'
    变量名 = 数据.at[0, 'a']
    '''
    pd.read_excel(路径,skiprows=8,usecols='F:I',dtype=('序号':str,'性别':str))
    for i in data.index: 循环需要填充行的索引
    data['序号'].at[i] = i + 1
    这里['序号']是字段名 at方法是获取单元格内容 并赋值
    data['性别'].at[i] = '男' if i%2 == 0 else '女' 三目运算
    data['日期'].at[i] = 起始日期 + datetime.timedelta(days=i) 填充日期
    data['日期'].at[i] = datetime.date(起始日期.year + i,起始日期.month,起始日期.day)
    填充数据 后期都需要做字符串处理 所以需要在赋值前 把运算结果做好
    for循环里面 不能添加DataFrame操作 在循环里只是修改或添加 数据
    如 data.set_index('序号',inplace=True) 个人想法 可能这个方法本身就是循环的

    列于列计算
    data['销售金额'] = data['单价'] * data['销售金额']


















  • 相关阅读:
    【智能家居篇】wifi网络接入原理(上)——扫描Scanning
    ExtJS学习-----------Ext.Array,ExtJS对javascript中的Array的扩展
    android之JSON 进行网络数据交换
    ios应用接入微信开放平台
    android 视频文件不能进行幻灯片的播放
    打一辈子的工才是最大的风险
    《梦断代码》摘录及感悟
    android怎样查看当前project哪些profile是打开的
    Cocos2d-x 游戏存档
    CBitmap,HBitmap,Bitmap区别及联系
  • 原文地址:https://www.cnblogs.com/xuexihainan/p/15322067.html
Copyright © 2011-2022 走看看