python数据清洗学习笔记–数据表处理
1、数据常用筛选方法
• 在数据中,选择需要的行或者列
• 基础索引方式,就是直接引用
• ioc[行索引名称或者条件,列索引名称或者标签]
• iloc[行索引位置,列索引位置]
注意, 区分loc和iloc
basic[['户主姓名','农户生产经营类型']]
basic.loc[0:2,['户主姓名', '户主身份证号']]
order.iloc[:,[0,2]]
basic.loc[basic['健康状况']== '良好',['户主姓名', '户主身份证号','健康状况']]
basic.iloc[3,[1,2]]
2、数据的增加和删除
• 在数据中,直接添加列
• 使用df.insert方法在数据中添加一列
• 掌握drop(labels,axis,inplace=True) 的用法
• labels表示删除的数据, axis表示作用轴,inplace=True表示是否对原数据生效
• axis=0按行操作, axis=1按列操作
• 使用del函数直接删除其中一列
del basic['数据']
basic.drop(labels = ['敬老爱幼情况', '家庭和睦情况'],axis = 1,inplace=True)
basic.drop(labels= range(6,11),axis=0,inplace=True)
basic.insert(0, '出生年月', mid)
交换两列的位置:
- 可以使用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)
#删除这两列,加inplace代表是否在原数据上操作,1代表沿着列的方向
# 同时删除多个变量,需要以列表的形式
# 注意inplace =True,代表是否对原数据操作, 否则返回的是视图,并没有对原数据进行操作
# labels表示删除的数据, axis表示作用轴,inplace=True表示是否对原数据生效,
# axis=0按行操作, axis=1按列操作
3、数据的修改和查找
• 在数据中, 可以使用rename修改列名称或者行索引名称
• 使用loc方法修改数据
• 使用loc方法查找符合条件的数据
• 条件与条件之间用&或者|连接,分别代表‘且’和‘或’
• 使用between和isin选择满足条件的行
# 将gender为0的改为女性,1改为男性,2改为未知
df1.loc[df1['gender']=='0','gender']='女性'
df1.loc[df1['gender']=='1','gender']='男性'
df1.loc[df1['gender']=='2','gender']='未知'
df1.head(10)
basic[['户主身份证号','性别']][(basic.健康状况== '良好') & (basic['农户家庭人数'] >3)]
basic[['户主身份证号','性别','婚姻状况']][ basic['农户家庭数'].between(4,10,inclusive=True)]
basic.loc[basic['是否加入农民合作社']== '未知']]
basic.rename(columns = {'出生年月':'出生日期','文化程度':'受教育水平' },inplace = True)
basic.rename(index = {1:'one','10':'ten' },inplace = True)
# 重置索引
df1.reset_index(drop=True,inplace=True)
条件查询:
df[df.buy_mount > 3].head(5)
# ~代表非
df[~(df.buy_mount>3)].head(5)
#多条件查询
df[ (df.buy_mount > 3) & (df.day > 20140101)].head(5)
#使用between,inclusive=True代表包含
df[ df['buy_mount'].between(4,10,inclusive=True)]
# 使用pd.isin()方法
# 包含
df[df['auction_id'].isin([41098319944, 17916191097, 21896936223])]
4、数据整理
定义:
在数据清洗过程中,很多时候需要将不用的数据整理在一起,方便后续的分析,这个过程也叫数据合并
合并方法:
常见的合并方法有堆叠和按主键进行合并,堆叠又分为横向堆叠和纵向堆叠,按主键合并类似于sql里面的关联操作
• 横向堆叠将两张表或多张表在X轴方向,即横向拼接在一起
• 纵向堆叠将两张表或多张表在Y轴方向,即纵向拼接在一起
• 注意使用concat时,axis =1用于横向,0代表纵向
• 注意join取inner或者outer时,分别代表交集和并集
merge1 = pd.concat([df1,df2],axis=1,join='inner’)
merge1 = pd.concat([df1,df2],axis=1,join='outer’)
order_merge = pd.concat([order1,order2,order3],axis=0,ignore_index=False)
order_merge.reset_index(inplace=True)
conncat:
import xlrd
workbook = xlrd.open_workbook('meal_order_detail.xlsx')
sheet_name = workbook.sheet_names() #返回所有sheet的列表
sheet_name
[‘meal_order_detail1’, ‘meal_order_detail2’,
‘meal_order_detail3’]
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
Out[93]:(2779, 19)
# 通过循环方式进行合并
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
Out[95]:(10037, 19)
inner/outer:
# 交易数据
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')
5、层次化索引
在一个轴上拥有两个或者两个以上的索引
• 使用loc语句进行访问
• loc里面接受tuple,如loc[(a,b),:]
记录自:python数据清洗实战–Peter老师