小言_互联网的博客

python数据清洗数据表处理

369人阅读  评论(0)

1.常用库

import pandas as pd
import numpy as np
import xlrd  #Excel数据处理
import os
#更改文件路劲
os.chdir(r'E:\python\数据')

2.数据读取

常用编码为utf-8、gbk 、gbk2312和gb18030等。

#读取csv数据
df = pd.read_csv('baby_trade_history.csv', encoding='utf-8',dtype={'user_id':str})
df1 = pd.read_csv('sam_tianchi_mum_baby.csv',encoding = 'utf-8',dtype =str)  #将数据转换为字符串格式
#读取excel数据
import xlrd
workbook = xlrd.open_workbook('meal_order_detail.xlsx')
sheet_name = workbook.sheet_names() #返回所有sheet的列表
order1 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail1',engine="python",encoding = "gbk")   #如果表格中有中文容易报错,加上engine="python"
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)  # 文件路径,模式,缓冲,编码格式,错误处理方式,换行符(只适用于文本模式),如果closefd为False则当文件关闭时基础文件描述符将保持打开状态。
"""
模式 
r--打开读取(默认)
w--打开进行写入,首先截断文件
x--创建一个新文件并打开它进行写入
a--打开进行写入,如果文件存在,则追加到文件末尾
b--二进制模式
t--文本模式(默认)
+--打开磁盘文件进行更新(读和写)
u--通用换行符模式(已弃用)
"""

3. 数据保存成文件

df.to_csv(‘df.csv’,index=False)
df.to_excel('a1.xlsx', sheet_name=‘sheet1', index= False,encoding='utf-8")

如果报错module ‘pandas’ has no attribute ‘to_excel’,是因为to_excel()函数必须用在Dataframes类型,
解决办法:

data = pd.DataFrame(data)
writer = pd.ExcelWriter("标准化后数据为.xlsx")
data.to_excel(writer,'Sheet1')
writer.save()

4.数据筛选

4.1数据查看

df.info()
df.head(5) #查看前5行
df.tail(5) #查看后5行
df.columns #查看变量名称

4.2简单索引

df['user_id']
df['user_id'][1:5]    # 第二行到第五行(区间是左闭右开)
df[['user_id','buy_mount','day']][:5]   #多个变量选择

4.3loc和iloc 的使用

df.loc[3:4]    # 选择行索引标签,选择行索引为3和4的行
df.loc[:,['user_id','buy_mount']]    #选择某两列
df.loc[1:3,['user_id','buy_mount']]    #loc在这里选择的是行索引标签
df.loc[df.user_id =='786295544',['user_id','buy_mount','day']]
df.loc[(df.user_id =='786295544') | (df.user_id =='444069173'),['user_id','buy_mount','day']]    # 多个条件选择

#注意iloc是位置
df.iloc[:,1:4]    #按照位置来选择第二列到第四列
df.iloc[:,[0,2]]    # 按照位置来选择第1列和第3列
df.iloc[3,[1,2]]    #选择第4行,第2列和第3列数据, 这里的3代表的不是索引标签而是位置
df.iloc[2:7,[1,2]]    #选择第3行到第7行,第2列和第3列数据

#注意loc和iloc的区别
df.loc[2:7]     #选择行索引为2,3,4,5,6,7的行
df.iloc[2:7]     #选择第3行到第7行

5.数据增加和删除

5.1增加一列

#增加一列,购买量,购买量超过3的为高,低于3的为底
df['购买量'] = np.where(df['buy_mount'] >3,'高','低')
# 增加行在dataframe中不常用,后面会用其他方法实现
# 可以使用append方法在 dataframe末尾实现

"""可以使用insert方法
df.insert(位置,变量名称,值)
将auction_id取出来,放在一列"""
# 先将这一列取出来,赋值给对象auction_id,然后在数据中删除这一列,再将其添加进去
auction_id = df['auction_id']
del df['auction_id']
df.insert(0, 'auction_id', auction_id)
df.head(5)

5.2删除

# 删除这两列,加inplace代表是否在原数据上操作,1代表沿着列的方向
# 同时删除多个变量,需要以列表的形式
# 注意inplace =True,代表是否对原数据操作, 否则返回的是视图,并没有对原数据进行操作
# labels表示删除的数据, axis表示作用轴,inplace=True表示是否对原数据生效,
# axis=0按行操作(列不动,行进行操作变化), axis=1按列操作
df.drop(labels = ['property', '购买量'],axis = 1,inplace=True) #删除这两列,加inplace代表是否在原数据上操作, 1代表沿着列的方向
# 按行删除法
df.drop(labels = [3,4],inplace = True,axis= 0) # 删除索引标签3和4对应的行
df.drop(labels= range(6,11),axis=0,inplace=True)  #删除索引名称1到10,注意range迭代器产生的是1到10
df     # 查看

5.3数据修改和查找

df1 = pd.read_csv('sam_tianchi_mum_baby.csv',encoding = 'utf-8',dtype =str)
df1.head(5)
# 将gender为0的改为女性,1改为男性,2改为未知
df1.loc[df['gender'] =='0','gender'] ='女性'
df1.loc[df['gender'] =='1','gender'] ='男性'
df1.loc[df['gender'] =='2','gender'] ='未知'
df1.head(10)
#修改列名称
basic.rename(columns={},index={})
# 修改列标签和行索引名称
df1.rename(columns = {'user_id':'用户ID','birthday':'出生日期','gender':'性别'},inplace = True)
df1.rename(index = {1:'one',10:'ten' },inplace = True) #修改行索引名称
df1.reset_index(drop=True,inplace=True)# 重置索引
df1.head(10)
#查询
# 条件查询
df[df.buy_mount > 3] #性别等于未知
df[~(df.buy_mount > 3)] # ~代表非
df[ (df.buy_mount > 3) &  (df.day > 20140101)] # 多条件查询
#使用between,inclusive=True代表包含
df[ df['buy_mount'].between(4,10,inclusive=True)]
# 使用pd.isin()方法
# 包含
df[df['auction_id'].isin([41098319944, 17916191097,21896936223])]

5.4 数据整理

横向堆叠在数据清洗中不常用,纵向堆叠可以理解为把不同的表,字段名称一样。整合在一起

import xlrd
workbook = xlrd.open_workbook('meal_order_detail.xlsx')
sheet_name = workbook.sheet_names() #返回所有sheet的列表
sheet_name  #查看工作表
order1 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail1')
order2 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail2')
order3 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail3')
order = pd.concat([order1,order2,order3],axis=0,ignore_index=False)# 忽略原来的索引
order1.shape

# 通过循环方式进行合并
basic = pd.DataFrame()
for i in sheet_name:
    basic_i = pd.read_excel('meal_order_detail.xlsx', header = 0,sheet_name=i,encoding='utf-8')
    basic = pd.concat([basic,basic_i],axis=0)
basic.shape

#关联,关联字段必须类型一致
df = pd.read_csv('baby_trade_history.csv', encoding='utf-8',dtype={'user_id':str})# 交易数据
df1 = pd.read_csv('sam_tianchi_mum_baby.csv',encoding = 'utf-8',dtype =str)#婴儿信息
df2 = pd.merge(left = df, right=df1,  how='inner',  left_on='user_id', right_on = 'user_id')# 内连接
df2.head(10)

4.5 层次化索引

df = pd.read_csv('baby_trade_history.csv', encoding='utf-8',dtype={'user_id':str},index_col=[3,0])#将数据第4列和第1列当成索引
df.loc[28] #第一层引用
df.loc[28].loc[[82830661,532110457]]#第二层引用

#直接引用两层
df3.loc[(a,b),:] #a和b分别代表第一层和第二层的索引

#接受tuple
df.loc[(28,[82830661,532110457]),:]# 第二层索引选择,多个选择
df.loc[(28,[82830661,532110457]),['auction_id','cat_id']]# 第二层索引选择,选择2个变量
df.loc[([28,50014815])] #第一层索引为28和50014815

转载:https://blog.csdn.net/qiuqiu1027/article/details/104928980
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场