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['销售金额']