pandas

2021/9/22 23:17:29

本文主要是介绍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是列索引  值是数据
 '''
    姓名 性别
 张三  男
 李四  女
 '''
 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
   姓名 姓别  年龄    
 张三  男  22
 李四  女  23
 王五  男  24
列表形式的Series
  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)
'''
 2
 1  2
 4  5
 7  8
******************************
 2
 1  2
 4  5
 7  8
 1  2
 4  5
 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['销售金额']




















这篇关于pandas的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程