Pandas01

需要的模块:pandas、openpyxl

索引从0开始

演示示例在末尾,自行下载

1、read_excel表头参数

import pandas 

df = pd.read_excel(r'd:/data/demo.xlsx', engine='openpyxl')

t = pd.read_table(xxx.txt’,encoding="gbk",sep=’\t’,header=None) #用sep指明分隔符

以下示例省略engine 参数

指定读取的表名sheet_name

指定为数字n,即读取第n号工作表n从0开始计数。可指定为工作表的字符串还可指定为列表导入多个工作表。(读取多张表df是一个字典,里面每个元素是一个Dataframe对象容纳一张表格)

df = pd.read_excel(r'd:/data/demo.xlsx', sheet_name=1)

df = pd.read_excel(r'd:/data/demo.xlsx', sheet_name='社区编号')

df = pd.read_excel(r'd:/data/demo.xlsx', sheet_name=[0,1])
#如果一次读取多张工作表,df就是一个字典(dict),里面每个元素是一个Dataframe对象,容纳一张表格。每个元素的键就是列表中给出的编号,值就是对应的表格内容Dataframe。所以df[0]就是第一张工作表的Dataframe。

指定表头列名header

指定以哪一行作为表头列名。可指定整数值作为表头列名,可指定多行作为表头列名,指定None时表示不以任何行作为表头列名。

# header参数为整数值时,表示以哪一行作为表头列名。例如以表格中第三行作为表头列名:
df = pd.read_excel(r'd:/data/demo.xlsx', header=2)

#header参数指定为列表(list)时可以同时指定多行作为表头列名,例如以表格中第 3~5 行作为表头列名:
df = pd.read_excel(r'd:/data/demo.xlsx', header=[2, 3, 4])

#header参数指定为 None 时表示不以任何行作为表头列名,pandas自动生成数字列名:
df = pd.read_excel(r'd:/data/demo.xlsx', header=None)

自定义列名称names

当header=None时,指定names参数,即自定义列名称。

df = pd.read_excel(r'd:/data/demo.xlsx', header=None, 

                        names=['网址', '编号', '小区', '时间'])

2、read_excel表体参数

读取前n行nrows

# 读取前20行数据
df = pd.read_excel(r'd:/data/demo.xlsx',nrows=20)

指定列数/列名读取usecols

指定需要读取,常用于跳过空白列;可跳过指定,字符串ABC可以指定范围,但整数值不可

#读取表格中C列到Q列的数据,跳过A列和B列:
df = pd.read_excel(r'd:/data/demo.xlsx', usecols="C:Q")

#读取表格中非连续列:
df = pd.read_excel(r'd:/data/demo.xlsx', usecols="D, F, I:K")

#通过数字列表读取对应列,读取第3列、第4列、第6列(用数字不能指定列范围):
df = pd.read_excel(r'd:/data/demo.xlsx', usecols=[2, 3, 5])

#通过列名读取对应列
df = pd.read_excel(r'd:/data/demo.xlsx',usecols=['id','name','age']

处理以“千分位分隔符”表示的数据thousands

thousands处理以“千分位分隔符”表示的数据且存储时必须为string类型

读取时设置索引index_col

指定作为索引

注意:index_col所设置的整数值索引并不是原始数据表中列的索引,而是抽取之后的数据(指定usecols参数)的列索引

#index_col参数指定为列名字符串时将对应的列作为索引,例如指定工作表中“id”列作为索引:
df = pd.read_excel(r'd:/data/demo.xlsx', index_col='id')

#index_col参数指定为整数值时将对应的列作为索引,例如指定第一列为索引:
df = pd.read_excel(r'd:/data/demo.xlsx', index_col=0)

#注意:index_col所设置的整数值索引并不是原始数据表中列的索引,而是抽取之后的数据的列索引。
#例如指定了usecols参数:
df = pd.read_excel(r'd:/data/demo.xlsx', usecols=[2, 3, 5], index_col=0)

    #此时读取后的第一列是原始表中的第三列,行索引指定为第0列是原始表的第三列数据。

跳过/读取前n行 skiprows

指定不读取(跳过)什么样的数据,可以根据指定函数决定跳过那些行。返回False则读入,返回True则跳过。

建议不跳过标题行

#指定为整数值n,跳过前n行。例如跳过前三行:
df = pd.read_excel(r'd:/data/demo.xlsx', skiprows=3)

    #注意:直接跳过前n行后,由于第一行被跳过,表头无法保持是第一行,第四行数据作为表头。

#指定为数字列表,跳过具体的某几行,例如只跳过第2行和第3行,保持第一行为表头:
df = pd.read_excel(r'd:/data/demo.xlsx', skiprows=[1, 2])


#指定为函数名时根据函数的返回值读取行,返回True则跳过,否则读取,该函数接收一个行索引值作为参数,行索引默认从0开始。例如获取所有奇数行:
def is_odd(x):
    if x%2 ==1:  #奇数
        return True
    else:
        return False
df = pd.read_excel(r'd:/data/demo.xlsx', skiprows=is_odd)
# 简易写法:
df = pd.read_excel(r'd:/data/demo.xlsx', skiprows=lambda x:x%2==1)

#随机抽取(跳过20%,读取80%的随机样本)
import random
def is_odd1(x):
    if random.randint(1,10)>8::
        return True
    else:
        return False

读取并处理缺失值

# 不将缺失值标记为 NA
data = pd.read_csv('数据.csv', keep_default_na=False)
# 将[]标记为缺失值
data = pd.read_csv('数据.csv',na_values=['[]'])
# 不处理缺失值
data = pd.read_csv("数据.csv",na_filter=False)
# 将缺失值标记为“数据缺失”
data.to_csv("out.csv",encoding = 'utf_8_sig',index = False,na_rep = '数据缺失')

读取时设置格式

# 指定字符串格式
data = pd.read_csv("数据.csv", dtype={'序号': str,'身份证号码':str}) 
# 指定时间格式
data = pd.read_csv("数据.csv",parse_dates=['时间']) 

读取剪切板数据 : pd.read_clipboard()

数据存储

建议存储在新表,否则其他sheet会被清空

data.to_csv("out.csv",encoding = 'utf_8_sig')
# 指定【名字、职业】两列保存
data.to_csv("out.csv",encoding = 'utf_8_sig',columns=['名字','职业'])
# 取消索引
data.to_csv("out.csv",encoding = 'utf_8_sig',index = False)
# 标记缺失值
data.to_csv("out.csv",encoding = 'utf_8_sig',index = False,na_rep = '数据缺失')
# 保存为ZIP
compression_opts = dict(method='zip',
                        archive_name='out.csv')  
data.to_csv('out.zip', index=False,
          compression=compression_opts)  
# 保存为 Excel
data.to_excel("test.xlsx")

3、数据结构之Series

  • 一个DataFrame对象由若干个Series列对象构成,可以使用列索引作为下标取出整列数据,例如取出“总价”列的数据:data['总价'] 。
  •  Series类型对象由 “索引对象” 和 “数组对象” 构成,通过values属性与index属性可以获取其中的数据。
  • Series对象的values属性得到一个一维ndarray类型数组对象,该数组中的元素是列中的数据,根据数字索引可以从数组中获取某个元素,例price列对象中的第一个元素:price.values[0] 。
  • Series对象的index属性得到一个Int64Index类型对象,该对象中的元素是列中数据的索引。
  • Series支持数组的整体运算,例如price对象与数值做整体运算:price / 7.0 ,该操作不影响price对象原本的值,除非重新赋值:price = price / 7.0 。

一、Series创建方法:

Series(数据来源,索引来源)

index属性的内容可以是数字字符串日期时间等,可以重新指定index属性,即更改Series的索引内容。

Series[数字下标]:如果索引也是数字类型,则Series[n]被视作索引名为数字n的元素,而不是数组从0计数时的n号下标元素。避免此问题可以将索引名转换成字符串类型。

#创建
s = pd.Series(a, b) 
'''
    虽然s的数据来自于a、b两个列表,但s新建了一个数组对象和索引对象来存放这些数据。
            数据来源与索引来源可以是列表,也可以是元组或range等可迭代对象
'''
#获取单列
s['总价']   

#修改索引内容
s.index=['一','二','三','四']

#数字索引转换为字符串索引
price.index = [ str(i) for i in price.index ]

二、Series对象与字典相似之处

1、直接用字典创建Series对象

dic_age = {'张三': 30, '李四': 25, '王五': 27}
s = pd.Series(dic_age)

2、Series与字典类似的方法操作

Series支持 in 操作符,判断索引是否在对象中,返回 True 或 False

'李四' in s

Series支持添加新的索引和值

s['田七'] = 52

keys方法获取所有的索引值, 该方法与index属性一样

s.keys()

items方法获取所有索引和值,该方法返回一个zip对象,通常通过list方法转换为列表

list(s.items())

三、Series对象与数组相似之处

1、像数组一样使用切片、掩码和花式索引

Series支持花式索引,索引可以是数字编号,也可以是字符串

import pandas as pd
data = pd.read_excel(r'F:/demo/house_14-15.xlsx',usecols=[0,5,7,8,13],index_col=0)

#获取price中第2行、第4行、第5行的数据:
price[[1, 3, 4]]

#获取price中索引为'天通苑04'、'新街口01'、'模式口01'对应的值:
price[['天通苑04', '新街口01', '模式口01']]

Series支持掩码过滤,例如筛选出价格大于500且小于800的数据:

price[(price > 500) & (price < 800) ]

Series支持使用切片截取子集

  •         Series.loc[ ] :按索引名进行切片,包含结尾元素
  •         Series.iloc[ ] :按下标进行切片,不包含结尾元素
#按索引名进行切片
price.loc[3:5]
price.loc['天通苑05':'新街口01'] #使用索引指定范围包含结尾元素新街口01

#按下标进行切片
price.iloc[0:4]

Series允许存在索引名相同的多条记录,查询该索引,会得到一个Series对象,包含全部这些记录。

4、DataFrame用法

一、DataFramed对象特性

DataFramed由若干个Series组成

二、创建DataFrame

  1. 将Series依次放入字典
  2. 为每个Series指定字符串名称
  3. 整体放入DataFramed方法即可

Series的元素个数不同、索引名称各异,可以对齐合并,合并后的DataFrame包含所有Series的索引,空白处填写NaN

import pandas as pd
data = pd.read_excel(r'F:/demo/house_14-15.xlsx',usecols=[0,5,7,8,13],index_col=0)

price = data['总价']
rooms = data['卧室']

df = pd.DataFrame({'房屋售价':price,'卧室数量':rooms})
df

三、从DataFrame获取整列数据

  1. df[ '列名' ]
  2. df.列名   (不建议使用对象.属性名的方法获取整列数据)

四、从DataFrame获取多列数据,使用花式索引

结构:df[ [ 列名1, 列名2, ... ] ]

df[ ['总价','面积','卧室'] ]

五、从DataFrame获取整行数据

  1.  df.loc[ 行索引 ]   :接收布尔值

  2. df.iloc[ 行下标 ]

#获取一条数据,返回Series对象
data.loc['天通苑04']

#获取一个范围数据,返回DataFrame对象
data.loc['天通苑04':'汽南小01']
#以上未设置index_col会报错

#获取一个范围数据,返回DataFrame对象
df.iloc[0:3]

# loc 接收布尔值
df.loc[df['国家奥委会']=='中国']

注意:

如果得到的是一条数据,则放在一个Series对象中返回。loc包含切片结尾项,iloc不包含切片结尾项;如果得到的是多条数据,则返回一个DataFrame对象。

六、从DataFrame.loc方法使用掩码筛选行数据

例如筛选总价大于800且卧室小于3的数据:

data.loc[ ( df['总价']>800 ) & ( df['卧室']<3 ) ]

 七、从DataFrame.loc方法实现二维切片

 结构:df.loc[ 行范围, 列范围 ]、df.iloc[ 行范围, 列范围 ]

#获取 '天通苑' 的 '面积' :
df.loc[ '天通苑', '面积' ]

#获取 '天通苑'~'新街口' 行中 '面积'~ '建成时间' 列:
df.loc[ '天通苑':'新街口', '面积':'建成时间' ]

#获取 '天通苑'~'新街口' 行中 '面积'、'总价'、'卧室' 列:
df.loc[ '天通苑':'新街口', [ '面积', '总价', '卧室' ] ]

#获取 '总价' 大于 800 的行中,'总价'、'面积' 列:
df.loc[ df['总价']>800, [ '总价', '面积' ] ]   #注意df['总价']列名要写全

  iloc与loc用法基本一样,只不过将索引名称换为数字下标。注意iloc不包含切片结尾项。

八、DataFrame.values属性

DataFrame.values属性获取numpy的二维数组,DataFrame转换为numpy的二维数据。

np.sum(df.values) 

九、list转换DataFrame

pd.DataFrame(list,,columns=['Column_Name'])

十、判断是否为DataFrame

import pandas as pd
# 判断变量是否是DataFrame
def is_dataframe(var):
    return isinstance(var, pd.DataFrame)

5、DataFrame运算

一、整体运算

DataFrame支持整体运算,例如一个DataFrame对象与整数相乘,那么对象选中的每一个数据都与该整数相乘,得到新的DataFrame对象。 

tv = pd.DataFrame({'张三':np.random.randint(1,10),'李四':np.random.randint(1,10)},index=['一月','二月','三月'])
t=tv*10

二、DataFrame支持numpy的统计函数

例:对DataFrame按列求和:

 结果将得到每一列的总和组成的数据。

例:对所有数据求总和:

 例:求所有人销量之和:

 统计函数中的轴向参数 axis 与数组中用法相同,0 表示从上到下方向,1 表示从左到右方向。

三、对位运算

  • 行列相同则完全对位运算,与Numpy相同。
  • 行列不同能自动对齐运算,比Numpy灵活。
tv =pd.DataFrame({'张三':[50,52,47],'李四':[61,39,40]},index=['1月','2月','3月'])
ipad =pd.DataFrame({'王五':[48,39],'李四':[10,20]},index=['2月','5月'])
#对位运算
tv+ipad

   

        pandas首先根据索引名与列名将两个DataFrame对象转换相同形状的对象,自动填充的数据为 NAN,表示缺失值,然后再对位计算同一个位置上的值是 数值NAN 时,得到的结果也是 NAN:

 

四、算术方法

DataFrame中支持使用算术方法替代算术符号。

Add方法

df1.add(df2),相当于df1+df2,可选参数fill_value将一个NAN替换为指定数值

add方法合并两个DataFrame对象:

  1. 相同位置的数据中,有一个NAN,则将NAN视作fill_value参数所指定的值
  2. 如果两边都是NAN,则计算结果认为NAN。

例:合并两个df数据

 DataFrame其他算术方法,均有fill_value可选参数:

df1.sub(df2) #减法

df1.mul(df2) #乘法

df1.div(df2) #除法

df1.mod(df2) #求模

df1.pow(df2) #乘方

df1.floordiv(df2) #整除

五、反向算术方法

DataFrame的反向算术方法。以r开头的算术方法是以方法的参数与DataFrame对象进行运算,例如计算倒数: df.rdiv(1, fill_value=0) 表示1为被除数,df为除数,缺失值设置为0。

 “inf”表示无穷大,例如在pandas中当 1/0 时,结果就是“inf”。

六、DataFrame与Series运算(广播机制)

当需要对DataFrame每列的数据与Series对位相乘时,不能用算术符号:

DataFrame与Series运算时,Series会被看做“一行”,相当于一行三列数据,每列的名字为1月2月和3月。可以使用算术方法的axis属性设置参与运算的Series排列方向,当axis0时,Series按照垂直方向(行维度)排列运算,当axis1时按照水平方向(列维度)排列运算。

 例如tv与price相乘,price按照垂直方向排列运算

事实上由于DataFrame里面基本上只有行和列,也就是0号和1号两个维度,所以axis参数可以写0或1,也可以写字符串'index'代替0,'columns'代替1。tv.mul(price,axis='index')

目前版本pandas中,DataFrame与Series计算时,fill_values参数无效。

缺失值

检查全部缺失值

df.isna().sum().sum()

检查每列缺失值

df.isnull().sum()

定位缺失值

为了后面更方便的处理缺失值,现在先看看全部缺失值所在的行

df[df.isnull().T.any() == True]

 高亮缺失值

(df[df.isnull().T.any() == True]
.style
.highlight_null(null_color='skyblue')
.set_table_attributes('style="font-size: 10px"'))

删除缺失值

df = df.dropna()

整体填充补全

df = df.fillna('*') 

向下填充补全

df['评分'] = df['评分'].fillna(axis=0,method='ffill')

整体均值填充补全

df['评价人数'] = df['评价人数'].fillna(df['评价人数'].mean())

上下均值填充补全

df['评价人数'] = df['评价人数'].fillna(df['评价人数'].interpolate())

匹配填充补全

根据 “国家/地区” 列的值进行填充 “语言” 列的缺失值

df['语言']=df.groupby('国家/地区').语言.bfill()

6、ExcelWriter读取,可有多个sheet页

使用ExcelWriter对象调用to_excel()方法进行保存,只保留两个sheet

writer = pd.ExcelWriter(r'D:\demo.xlsx')
df = pd.DataFrame({'A':[1,2,3,4],'B':[11,12,13,14]})

df.to_excel(writer, sheet_name='test1')

df.to_excel(writer,sheet_name='test2')

writer.close()

写入Excel不覆盖其他工作簿和追加数据

import pandas as pd
 
# 创建一个DataFrame
df = pd.DataFrame({'Data': [10, 20, 30, 40]})
 
# 指定Excel文件的路径
file_path = 'example.xlsx'
 
# 使用ExcelWriter打开现有的Excel文件,并指定模式为'a'(追加)
with pd.ExcelWriter(file_path, mode='a', if_sheet_exists='overlay',engine='openpyxl') as writer:
    # 将DataFrame写入新的工作表,如果工作表已存在,则覆盖它
    df.to_excel(writer, sheet_name='NewSheet')
 
# 现在,example.xlsx文件中会有一个名为'NewSheet'的新工作表,
# 如果已经有同名工作表,其内容会被覆盖。

# 指定行号
with pd.ExcelWriter(file_path,mode='a', if_sheet_exists='overlay',engine='openpyxl') as writer:
         merged.to_excel(writer,sheet_name="NewSheet",startrow=writer.sheets["NewSheet"].max_row, index=False,)

7、pandas直接向工作表追加数据

pandas1.4.0以上版本以上可实现

import pandas as pd

df = pd.DataFrame([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                  columns=['A', 'B', 'C'])
writer = pd.ExcelWriter(r"C:\Users\HP\Desktop\测试.xlsx", engine='openpyxl',
                        mode='a', if_sheet_exists="overlay")
df.to_excel(writer, sheet_name=writer.book.active.title,
            index=False, startrow=7, startcol=6)
writer.close()


来自杨洋老师的课堂笔记(点击跳转)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值