pandas入门复习(数据处理)

本文介绍了pandas库的数据处理基础,包括数据文件导入(read_csv等)、缺失值和重复值处理、数据截取、数据抽取、数据框合并与拼接、SQL风格的联合查询、计算、随机抽样、数据标准化及时间格式数据的处理。适合数据分析初学者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据文件的导入和导出(read_csv\read_excle\read_table)

"""
读取csv文件
"""
import pandas as pd

df_1 = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/1.数据导入与导出/data1.csv',
            encoding = 'utf8',engine = 'python')

df_2 = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/1.数据导入与导出/data2.csv',
            encoding = 'utf8',engine = 'python',header = None)
#header = None 没有表头,有时候第一行数据会变成表头,使用这个参数修正

'''
读取excle文件
'''
df_3 = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/1.数据导入与导出/data3.xlsx')

'''
读取txt文件
有时候数据会粘在一起,可以用sep = ‘,’隔开
'''
df_4 = pd.read_table(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/1.数据导入与导出/data4.txt',
                     sep = ',', engine = 'python',header = None)

'''
导出文件
index = True(False) 是否有行标签
header = True(False) 是否有表头
'''
df_1.to_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/1.数据导入与导出/导出.csv',
            index = True, header = True)

df_2.to_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/1.数据导入与导出/导出.xlsx',
            index = True, header = True)

'''
utf-8:包含全世界所有国家需要用到的字符,英文网站用的较多
gbk:包含所有的中文字符
unicode:把所有语言统一到一套编码(占的内存更大)
'''

缺失值和重复值处理

缺失值处理(isnull()、fillna()、dropna())

"""
缺失值和重复值处理
"""
'''
缺失值处理
'''
import pandas as pd

#gbk:包含所有中文字符,默认是utf-8。文件中有中文,如果不修改成gbk会乱码。
df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/2.缺失值处理/data.csv',
                 encoding = 'gbk', engine = 'python')

'''
isnull()
进行逻辑判断,判断空值所在的位置
'''
na = df.isnull()

'''
找出空值所在的行数据【逻辑判断+取数】
'''
#na.any(axis = 1)逻辑判断
df[na.any(axis = 1)]#取数

'''
找出空值所在的列
'''
na[['gender']].any(axis = 1)
df[na[['age','gender']].any(axis = 1)]

'''
填充缺失值fliina()
'''
df_1 = df.fillna('1')

'''
删除缺失值(默认删除整行数据)
'''
df_2 = df.dropna()

重复值处理(duplicated()、drop_duplicates)

"""
重复值处理
"""

import pandas as pd

#gbk:包含所有中文字符,默认是utf-8。文件中有中文,如果不修改成gbk会乱码。
df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/3.重复值处理/data1.csv',
                 encoding = 'gbk', engine = 'python')

'''
找出重复值【逻辑判断】完全一致时才会判定为true
'''
result1 = df.duplicated()

'''
根据列名来判断重复值
'''
#根据某个
result2 = df.duplicated('gender')

#根据某些
result3 = df.duplicated(['gender','name'])

'''
提取重复行df[]
'''
df[result1]
df[result2]

'''
删除重复行
'''
#删除完全重复
df_1 = df.drop_duplicates()
#根据列名来删除
df_2 = df.drop_duplicates(['gender','name'])

slice函数的应用:字段截取

字段截取函数,作用对象是字符串

"""
slice函数的应用
字段截取函数,作用对象是字符串
身份证:
前六位:地址码
接下来8位:出生日期码
再3位:顺序码
最后一位:校验码
"""
import pandas as pd 

df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/4.slice函数的使用/data1.csv',
                 encoding = 'gbk', engine = 'python')

#id 的颜色有深有浅,说明是数字型,不是字符串型
'''
将id转化为字符串
'''
df['id'] = df['id'].astype(str)

'''
提取地址码
'''
#area = df['id'].slice(0,6) #'Series' object has no attribute 'slice'
area =df['id'].str.slice(0,6)

'''
提取出生日期码
'''
birthday = df['id'].str.slice(6,14)

'''
提取顺序码
'''
ranking = df['id'].str.slice(14,17)

'''
提取校验码
'''
only = df['id'].str.slice(17)

'''
将信息回填到数据框
'''
df['area'] = area
df['birthday'] = birthday
df['ranking'] = ranking
df['only'] = only

数据抽取(df[df[]])

本质:先逻辑判断再取数

"""
数据抽取:
根据一定条件,抽取数据
"""
import pandas as pd

df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/5.数据抽取/data1.csv',
            encoding = 'gbk')
 
'''
比较运算:包含大于、小于运算
between()
实际上【逻辑判断+取数】
'''
#抽取好评数>17000的行
df[df['好评数'] > 17000]
#抽取15000 > 好评数 > 17000的行 
df[df['好评数'].between(15000,17000)]

'''
字符串匹配:contains()
默认空值会被取出(默认na = True)
na = False:空值不会被取出
'''
df[df['品牌'].str.contains('苹果',na = False)]
df[df['品牌'].str.contains('苹果',na = True)]

'''
逻辑运算
一定要加入小括号以免优先级出错
'''
#取出好评 > 16000,价格 < 7000的电脑
df[(df['好评数'] > 16000) & (df['价格'] < 7000)]
df[(df['好评数'] > 18000) | (df['价格'] < 6000)]

数据框合并(concat())

"""
数据框合并
concat()函数
concat([df1,df2,df3.....])
"""
import pandas as pd
import numpy as np

df_1 = pd.DataFrame(np.arange(12).reshape(3,4))
df_2 = 2 * df_1

#竖向合并:默认axis = 0
new_df_1 = pd.concat([df_1,df_2])

#横向合并
new_df_2 = pd.concat([df_1,df_2], axis = 1)

'''
join参数:inner表示交集,outer表示并集
'''
df_3 = pd.DataFrame(np.arange(12).reshape(3,4),index = ['A','B',2]) 
#按交集横向合并,axis =1 跨列横向合并
new_df_3 = pd.concat([df_1,df_3],axis = 1,join = 'inner')
#按并集横向合并
new_df_4 = pd.concat([df_1,df_3], axis =1, join = 'outer')

数据框内容列拼接

"""
 数据框的内容拼接
"""
import pandas as pd
df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/7.合并数据框的列/data1.csv',
            encoding  = 'gbk')
new_df = df.astype(str)
new_df['id'] = new_df['area'] + new_df['birthday'] + new_df['ranking'] + new_df['only']

merge函数(SQL 样式的联合查询)

"""
merge函数:merge(df1,df2,how)
拼接两个数据框
"""
import pandas as pd

df_1 = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/8.merge函数/data1.csv',
                 encoding = 'gbk')
df_2 = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/8.merge函数/data2.csv',
                   encoding = 'gbk')

#根据name将两个数据框合连接起来,删除各自数据框独有的信息
df_3 = pd.merge(df_1,df_2, left_on = 'name',right_on = 'name')

#根据name将两个数据框合连接起来,保留左边数据框独有的信息(右边部分会自动赋予空值)
df_4 = pd.merge(df_1,df_2, left_on = 'name',right_on = 'name', how = 'left')
#根据name将两个数据框合连接起来,保留右边数据框独有的信息
df_5 = pd.merge(df_1,df_2, left_on = 'name',right_on = 'name', how = 'right')
#根据name将两个数据框合连接起来,保留全部数据框独有的信息
df_6 = pd.merge(df_1,df_2, left_on = 'name',right_on = 'name',how = 'outer')

数据框计算

"""
数据框计算:
不建议使用,速度太慢
建议使用numpy中的array计算
"""
import pandas as pd
 
df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/9.数据框计算/data1.csv',
                 encoding = 'gbk')
df['总价'] = df['单价'] * df['数量']
#仅计算,不显示,会有warnning
df.总价 = df['单价'] * df['数量']
df.单价 * 2

随机抽样

"""
随机抽样
1.按照个数抽样 sample(n[,replace])
2.按照比例抽样:采用的更多 sample(frac[,repalce])
"""
import numpy as np
import pandas as pd
#生成一个DataFrame
df = pd.DataFrame(np.arange(600).reshape(100,6), columns = list('ABCDEF'))
 
#设置随机种子
np.random.seed(seed =2)
#按个数抽样【不放回】
df.sample(n = 10)
#按个数抽样【有放回】
df.sample(n = 10, replace = True)
#按百分比抽样【不放回】
df.sample(frac =0.1)#600*0.1=60个
#按百分比抽样【有放回】
df.sample(frac = 0.1, replace = True)

数据标准化

"""
数据标准化

目的:消除量纲的影响

数据标准化的方式:
1、0-1标准化:也称离差标准化,他是对原数据进行线性变换,使用结果落在【0,1】区间
X = (x-min())/(max()-min())
2、Z标准化:数据均值为0,方差为1
X = (x - mean())/std()
"""
import pandas as pd

df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/11.数据标准化/data1.csv',
                 encoding = 'gbk', engine = 'python')

#0-1标准化
df['国内生产总值0-1标准化'] = round((df['国内生产总值'] - df['国内生产总值'].min()) \
                                 /(df['国内生产总值'].max() - df['国内生产总值'].min()), 2)#round(,2)保留两位小数

df['人均GDP0-1标准化'] = round((df['人均GDP']- df['人均GDP'].min())\
                              /(df['人均GDP'].max() - df['人均GDP'].min()), 2)

#分析相关性
df['人均GDP0-1标准化'].corr(df['国内生产总值0-1标准化'])
'''
0.9998341076160933--->相关性达到99.98%
'''

#Z标准化:有正有负
df['国内生产总值Z标准化'] = round( (df['国内生产总值'] - df['国内生产总值'].mean())\
                                 /df['国内生产总值'].std(),2)

df['人均GDP Z标准化'] = round( (df['人均GDP']-df['人均GDP'].mean() ) \
                              /df['人均GDP'].std(), 2)

#Z标准化的均值非常接近0,标准差接近1
df['国内生产总值Z标准化'].mean()
df['国内生产总值Z标准化'].std()

#分析相关性
df['国内生产总值Z标准化'].corr(df['人均GDP Z标准化'])

数据分组(列内分组)

"""
数据分组
cut()函数
cut(Series,bins,right = True,labels = null)
Series:需要分组的数据【数据框的某列数据】
bins:分组的划分数组【列表】
right:分组的时候,右边是否闭合,默认闭区间
labels:分组的自定义标签

"""
import pandas as pd

df = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/12.数据分组/data1.csv',
                 encoding = 'gbk')

#对人均GDP分组
bins = [min(df.人均GDP)-1,2000,4000,6000,8000,max(df.人均GDP)+1]
df['人均GDP分组'] = pd.cut(df.人均GDP,bins)
df['人均GDP分组'] = pd.cut(df.人均GDP, bins, right = False)

#自定义标签【分组后小组的组名】
labels = ['2000以下','2001-4000','40001-6000','6001-8000','8000以上']
df['人均GDP分组'] = pd.cut(df.人均GDP, bins, labels = labels)

时间格式数据

import pandas as pd

df = pd.read_csv(
r"/Users/dx/Desktop/Python数据分析与机器学习/3.数据分析处理库-Pandas/数据处理/13.时间格式数据/data1.csv",
encoding='gbk',engine='python')

"""
to_datetime()函数:
to_datetime(Series, format)
Series:字符型时间数据;【数据框的时间那一列】
format:格式化的方法
"""
#将字符型时间数据转化为时间格式数据
df['时间'] = pd.to_datetime(df.购买时间, format='%Y/%m/%d')

#将时间格式的数据转化为指定字符型数据
df['字符型时间'] = df.时间.dt.strftime('%Y/%m/%d')# %H:%M:%S 小时分钟秒

#提取时间格式数据中的年、月、周、日、时、分、秒
df['年'] = df['时间'].dt.year
df['月'] = df['时间'].dt.month
df['周'] = df['时间'].dt.weekday
df['日'] = df['时间'].dt.day
df['时'] = df['时间'].dt.hour
df['分'] = df['时间'].dt.minute
df['秒'] = df['时间'].dt.second
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值