pandas 进阶篇

pandas进阶篇

参考教程:Python自动化办公–Pandas玩转Excel(全30集)_哔哩哔哩_bilibili

本篇文章中将包括:多表联合、轴的概念、怎么把一列数据分成两列数据、求和求平均统计导引、定位、消除重复数据、旋转数据表(行&列转换)、透视表、分组和聚合、条件格式、行操作集锦、列操作集锦、

多表联合
"""
把两张有联系的数据表进行合并
比如一张为一班的数学成绩表  一张为一班的语文成绩表,但都是乱序的,所以我们需要将它们合并在一起
"""
import pandas as pd
# 文件路径相同,两者在同一个子表 sheet_name子表的名字
math = pd.read_excel('文件',sheet_name='math')
chinese = pd.read_excel('文件',sheet_name='chinese')
# 拿ID进行联立 默认是以math表为中心,其他表不匹配的数据会被丢弃 注意这时两张表都有'ID'列
table = math.merge(chinese, on='ID')
# 防止被丢弃,left表示chinese
table = math.merge(chinese, how='left', on='ID')
# 让没有分数的学生不为空,直接赋值为0 默认为浮点数
table = math.merge(chinese, how='left', on='ID').fillna(0)
# 防止为0
table = math.merge(chinese, how='left', on='ID').fillna(0)
table.score = table.score.astype(int)
# 之前拿着ID列进行联立,是因为两张表都有'ID'列,但是有的表不一定都有,所以我们可以通过以下方式:
table = math.merge(chinese, how='left', left_on='ID',right_on='ID').fillna(0)
# 当然其实不给也是可以的,它可以直接去查有没有相同的列
table = math.merge(chinese, how='left').fillna(0)
# 注意:当ID列被设置为index以后,合并时就自动查不到了,所以必须指定
# 同时也可以用join进行表格联立 ,其可以使用到数据库当中,同时其会主动选择ID作为联立的标准   但去除了rigth_on和left_on
table = math.join(chinese, how='left').fillna(0)
数据校验
"""
数据校验是指,放置有出格的数据,比如学生的分数一般位于0 100之间,那如果出现101分,这种数据就是数据有误
"""
import pandas as pd
# 校验函数 可以校验一种数据,也可以校验多种数据,在这里,我们仅演示校验一种数据
def score_validation(row):
    try:
        assert 0<=row.Score<=100
	except:
        print(f'#{row.ID}\tdf{row.Name}has an invalid score{row.Score}.')
    # 数据更正 或者 数据清除
    

def score_validation_1(row):
    if not 0 <= row.Score <= 100:
        print(f'#{row.ID}\tdf{row.Name}has an invalid score{row.Score}.')


df = pd.read_excel('文件')
# 轴的概念:axis有两个轴,一个是0,一个是1,0表示从上到下这个方向 1表示的是从左到右这个方向
df.apply(score_vaildation,axis=1)

把一列数据分割成两列
"""
需求:将姓名这一栏分成姓和名两栏
"""
import pandas as pd
df = pd.read_excel('文件',index_col='ID')
# 默认利用空格把一个字符串分成两部分
df_1 = df['Full Name'].str.split(expand=True)
# 也可以直接给空格,然后利用空格把一个字符串分成两部分
df_1 = df['Full Name'].str.split(' ',expand=True)
# 保留多少字符串 n=0或者1表示切出多少字符串就保留多少,n=3表示不管切出多少,只保留前面三个
df_1 = df['Full Name'].str.split(n=0 ,' ', expand=True)
df['First Name'] = df[0]
df['Last Name'] = df[1]
定位、消除重复数据
import pandas as pd
df = pd.read_excel('文件目录')
# 消除重复数据 keep保留前面还是后面
df.drop_duplicates(subset='Name',inplace=True,keep='first')
# 定位出重复数据 将其标记为true
dupe = df.duplicateed(subset='Name')
# 是否有重复数据 ,可以:
print(dupe.any())
# 拿出true(重复的数据)
dupe = dupe[dupe]  # dupe = dupe[dupe = true]
# 定位
df,iloc[dupe.index]
旋转数据表(行&转换)
import pandas as pd
pd.option.display.max_columns=999
df = pd.read_excel('文件目录',index_col='Month')
table = df.transpose()
print(table)
分类与汇总
import pandas as pd
import numpy as np
pd.option.display.max_columns=999
df = pd.read_excel('文件目录')
# 自动设别为DATA列可以转化为什么类型
print(df.Data.dtype)
# 获得日期的年份
df['Year'] = pd.DatetimeIndex(orders['Date']).year
# 求表格的pivot_table
df_1 = df.pivot_table(index = 'Category',columns='Year',values='Total',aggfunc=np.sum)
#手动求pivot_table
df_2= df.groupby('Category','Year')
#计数总销售额
s = df_2['Total'].sum()
# 计数买了多少价
c = df_2['ID'].count()
# 生成一个新的DataFrame
df_3 = pd.DataFrame({'Sum':s,'Count':c})

行操作集锦
import pandas as pd
df_1 = pd.read_excel('文件1目录',sheet_name='Page_001')
df_2 = pd.read_excel('文件2目录',sheet_name='Page_002')
# 追加 一张表格的数据加到另一张
df_3 = df_1.append(df_2).reset_index(drop=True)
# 追加一个新行
stu = pd.Series('ID':41,'Name':'A','Score':99)
df_4 = df_3.append(stu,ignore_index=True)
# 修改对应行的数据  例如修改39行的Name
df_4.at[39,'Name']= 'B'
# 将整行替换掉
stu = pd.Series('ID':40,'Name':'B','Score':99)
df_4.iloc[39] = stu
# 在数据表中插入一行
stu = pd.Series('ID':101,'Name':'D','Score':99)
# 切片
part_1 = df[:20]
part_2 = df[20:]
df_5 = part_1.append(stu,ignore_index=True).append(part_2).reset_index(drop=True)
# 删除数据行
df.drop(index=[0,1,2],inplace=True)
# 删除0-9之间的数据
df.drop(index=range(0,10),inplace=True)
# 或者
df.drop(index=df[0:10].index,inplace=True)
# 有条件的删除 删除哪些缺名字的学生
miss = df.loc[df['Name'].at[i]='']
df.drop(index=missing.index,inplace=True)
df = df.reset_index(drop=True)
列操作集锦
import pandas as pd
import numpy as np
df_1 = pd.read_excel('文件1目录',sheet_name='Page_001')
df_2 = pd.read_excel('文件2目录',sheet_name='Page_002')
# 将两个表加到一起
df_3 = pd.concat([df_1,df_2]).reset_index(drop=True)
# 将两个表并起来  少见
df_4 = pd.concat([df_1,df_2],axis=1)
# 追加列
df_4 = pd.concat([df_1,df_2]).reset_index(drop=True)
df_4['Age'] = np.repeat(25,len(df_4))
# 或者
df_4['Age'] = 25
# 或 0-len(df_4)
df_4['Age'] = np.arange(0,len(df_4))
# 删除列
df_4.drop(columns=['Age'],inplace=True)
# 插入列
df_4.insert(1,column='Age',value=np.repeat('foo',len(df_4)))
# 去掉空值操作
df_4['ID'] = df_4['ID'].astype(float)
# 创造控制
"""
for i in range(5,15):
	df_4['ID'].at[i] = np.nan
"""
df_4.dropna(inplace=True)

链接数据库(SQL Server)
# SQL Server 微软数据库
import pandas as pd
import pyodbc
# import sqlalchemy
# 创建链接
connection = pyodbc.connect("DRIVER={SQL Server};SERVER={LOCAL};DATABASE=AdventureWorks;USER=sa;PASSWORD=123456")
# 另一种连接方式

# connection_1 = sqlalchemy.create_engine('mssql+pyodbc://sa:123456@(local)/AdventuresWorks?driver=SQL+Server')

# SQL语句
query = 'select * from Person'

df_1 = pd.read_sql_query(query,connection)
# df_2 = pd.read_sql_query(query,connection_1)
复杂计算列
# 做列的计算,列的函数操作符
import pandas as pd
import numpy as np
# 求外接圆的面积
def get_circumcircle_area(l,h):
	r = np.sqrt(l**2 + h ** 2)/2
    return r**2*np.pi
def wrapper(row):
    return get_circumcircle_area(row['length'],row['height'])

df = pd.read_excel('文件目录',index_col='ID')
df['CA'] = df.apply(wrapper,axis=1)
# 另一种方式  去掉wrapper函数
df['CA'] = df.apply(lambda row:get_circumcircle_area(row['length'],row['height']),axis=1)
条件格式(筛选出特定条件的数据,并进行标记)使用 jupyter notebook 选择python 3
# 之所以使用 jupyter notebook,是因为pandas目前没有标红
import pandas as pd
# 施加在每个单元格上
def low_score_red(s):
    color = 'red' if s<60 else 'black'
    return f'color:{color}'
# 施加在列上
def high_score_green(col):
    return ['background-color:line' if s==col.max() else 'background-color:white' for s in col]
df = pd.read_excel('文件目录')
# 使用applymap表示把操作无差别的执行在选中区域上
df.style.applymap(low_score_red,subset=['test 1','test 2','test 3']).apply(high_score_green,subset=['test 1','test 2','test 3'])

# 使用背景颜色的深浅来表示数值的高低
import pandas as pd
import seaborn as sns
color_map = sns.light_palette('green',as_cmap=True)
df = pd.read_excel('文件目录',index_col='ID')
df.style.background_gradient(color_map,subset=['test 1','test 2','test 3'])
# 进度条显示
import pandas as pd
df = pd.read_excel('文件目录',index_col='ID')
df.style.bar(color='orange',color_map'',subset=['test 1','test 2','test 3'])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值