Pandas数据载入与预处理

本文详细介绍如何使用Pandas处理Excel、文本、JSON和数据库数据,涵盖数据合并、缺失值处理、数据清洗、重复值消除、数据转换和标准化方法。通过实例演示了如何操作,以及对tips_mod.xls文件的数据处理过程。
摘要由CSDN通过智能技术生成

Pandas数据载入与预处理

一、数据载入

1 读取excel,文本文件,csv

import numpy as np
#读取excel,默认读取第一个sheet
p = pd.read_excel('data//tips.xls')
#如果想读取student的sheet
p = pd.read_excel('data//tips.xls','student')
# print(p.head())
#读取txt文件
a = pd.read_table('data//a.txt')
# print(a.head())
#读取CSV文件
d = pd.read_csv('data//dots.csv')
print(d.head(3))

2、读取json,数据库

二、数据合并

1、merge数据合并

x = pd.DataFrame({'name':['A','B','C','D'],'age':[1,2,3,4]})
print(x)
y = pd.DataFrame({'name':['A','B','E'],'age':[1,5,6]})
print(y)
#默认合并的取的是两个数据的交集
print(pd.merge(x,y))

输出结果:

1.1 内连接-inner

#按name,将 x,y有相同name的进行合并
print('outer:\n',pd.merge(x,y,how='inner',on='name'))

输出结果:

1.2 外连接--outer

#外连:x,y的所有name罗列出来
print('outer:\n',pd.merge(x,y,how='outer',on='name'))

输出结果:

1.3 左连接-left

#外连:x,y的所有name罗列出来
print('outer:\n',pd.merge(x,y,how='outer',on='name'))

输出结果:

1.4 右连接-right

print('right:\n',pd.merge(x,y,how='right',on='name'))

输出结果:

1.5 参数suffiexes作用:重复列名的修改

print(pd.merge(x,y,on='name',suffixes=('_left','_right')))

 输出结果:

2、concat数据连接

默认情况下,会按行堆叠数据。

s1 = pd.Series([0,1],index=['a','b'])
s2 = pd.Series([2,3,4],index=['a','b','c'])
s3 = pd.Series([5,6],index=['f','g'])
print(pd.concat([s1,s2,s3]))

输出结果:

2.2 两个DataFrame的数据合并

data1 = pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc'))
print(data1)
data2 = pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz'))
print(data2)
data = pd.concat([data1,data2],axis=0)
print(data)

输出结果:

2.3

s1 = pd.Series([0,1],index=['a','b'])
print(s1)
s2 = pd.Series([2,3,4],index=['a','d','e'])
#print(s2)
s3 = pd.Series([5,6],index=['f','g'])
#print(s3)
s4 = pd.concat([s1*5,s3],sort=False)
print(s4)
s5 = pd.concat([s1,s4],axis=1,sort=False)
print(s5)

输出结果:

axis=1,按列进行合并,axis=0 表示的按行进行合并

s6 = pd.concat([s1,s4],axis=1,join='inner',sort=False)
print(s6)

输出结果:

三、数据清洗

1、缺失值检测和统计

1.1检测缺失值-isnull()

string_data = pd.Series(['lu','li','zhang',np.nan,'wang'])
print(string_data)
#打印是否为空值
print(string_data.isnull())
#缺失值的个数
print('缺失值的个数为:\n',string_data.isnull().sum())

输出结果:

1.2 isnull.sum() 统计缺失值

df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'])
#iloc 按索引进行选择(索引为2行以后的行,都为NAN)
df.iloc[2,:] = np.nan 
print(df)
# 统计每一列的空值的和
print(df.isnull().sum())

1.3、使用info可以查看缺失值

print(df.info()) #查看缺失值的情况,每一列,有几个不是缺失值

输出结果:

2、缺失值的处理

删除缺失值 -dropna()

在缺失值的处理方法中,删除缺失值是常用的方法之一。通过dropna方法可以删除具有缺失值的行。

dropna方法的格式:

dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

2.1 缺失值在Series的应用

from numpy import nan as NA
data = pd.Series([23,7,NA,3.5,NA])
print(data)
# print(data.dropna())
not_null = data.notnull()#判断是否不为空
print(not_null)

2.2 缺失值在DataFrame中的应用:

dropna()默认会删除任何含有缺失值的行

data = pd.DataFrame([[1,2,3,4],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
print('删除缺失值后:\n',data.dropna())

2.3 dropna 参数how-any(只要含有任何一个 ) all(全部为缺失值时删除)

data = pd.DataFrame([[1,2,3,4],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
print('删除全部为缺失值的行:\n',data.dropna(how='all'))

2.4 dropna参数axis=0( 按行) axis=1 (按列) 默认按行

data = pd.DataFrame([[1,2,3,NA],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
print('按列删除全部为缺失值后:\n',data.dropna(how='all',axis=1))

输出结果:

2.5 dropna中的thresh参数 表示一行至少有N个非NaN才参存活

data = pd.DataFrame([[1,2,NA],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
#表示一行中有两个不是缺失值可以存活
f = data.dropna(thresh=2)
#按列来看,有超过10%的缺失值的列删除
#f = data.dropna(thresh=len(data)*0.9,axis=1)
print(f)

输出结果:

3.填充缺失值--fillna

3.1 给定值填弃缺失值:df.fillna({1:0.88,2:0.99}

df = pd.DataFrame(np.random.randn(5,3))
print(df)
#索引行0-3,索引列1 设为 NaN
df.loc[:3,1]=NA 
#索引行0-2,索引列2 设为 NaN
df.loc[:2,2]=NA
#将索引列1的NaN填充为0.88,索引列2的NaN填充为0.99,inplace=True表示改变原数据
df.fillna({1:0.88,2:0.99},inplace=True)
print(df)

输出结果:

3.2 fillna中的method中的应用

注method='ffill' 向下填充

df = pd.DataFrame(np.random.randn(6,3))
#索引为2行到最后,索引为1的列
df.iloc[2:,1] = NA  
#索引为4行到最后,索引为2的列 
df.iloc[4:,2] = NA
print(df)
df.fillna(method='ffill',inplace=True)
print(df)

输出结果:

3.3 用Series的均值-mean()填充

data = pd.Series([1.,NA,3.5,NA,7])
print(data)
#使用均值填充
print(data.fillna(data.mean()))

输出结果:

4、检测与处理重复值

4.1 检测重复值---duplicates()

在DataFrame中利用duplicates方法判断每一行是否与之前的行重复。duplicates方法返回一个布尔值

data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
#判断是否和之前的行重复
print(data.duplicated())

输出结果:

 

4.2 删除重复的行--- drop_duplicates()

data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
//删除重复记录,默认保留第一个
b = data.drop_duplicates()
print(b)

指定列名看是否重复

data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
#指定部分列重复去重,只看k2,k3列,有重复的删除
b = data.drop_duplicates(['k2','k3'])
print(b)

默认保留的数 据为第一个出现的记录,通过keep='last' 可以保留最后一个出现的记录

data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
#保留最晚出现的重复值
b = data.drop_duplicates(['k2','k3'],keep='last')
print(b)

5、数据转换

5.1 替换

replace(要替换的值, 替换为的值)

data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','','石家庄']}
df = pd.DataFrame(data)
f=df.replace('','不详')
print(f)

传入列表实现多个值同时替换,第一个参数是要替换的值,第二个参数是替换为的值

data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','','石家庄']}
df = pd.DataFrame(data)
f=df.replace('','不详')
print(f)
#将'不详'替换为'石家庄',将'上海'替换为'广州'
fs = f.replace(['不详','上海'],['石家庄','广州'])
print(fs)

传入字典实现多值替换

data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','','石家庄']}
df = pd.DataFrame(data)
f=df.replace('','不详')
print(f)
fs = f.replace({'1':'男','0':'女'})
print(fs)

使用map方法映射数据

data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','武汉','石家庄']}
df = pd.DataFrame(data)
df['成绩']=[89,68,50,92]
print(df)
def grade(x):
    if x>=90:
        return '优'
    elif 70<=x<90:
        return '良'
    elif 60<=x<70:
        return '中'
    else:
        return '差'
df['等级']=df['成绩'].map(grade)
print(df)

6、数据的标准化

6.1 离差标准化数据

 

def MinMaxScale(data):
    data = (data-data.min())/(data.max()-data.min())
    return data
x = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
print('原始数据为:\n',x)
x_sc=MinMaxScale(x)
print('标准化后矩阵为:\n',x_sc)

6.2 标准差标准化数据

 

def StandardScale(data):
    data = (data-data.mean())/data.std()
    return data
x = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
print('原始数据为:\n',x)
x_sc = StandardScale(x)
print('标准化后矩阵为:\n',x_sc)

输出结果:

 

6.3 数据转化

类别型数据的哑变量处理

df = pd.DataFrame([
            ['green', 'M', 10.1, 'class1'],
            ['red', 'L', 13.5, 'class2'],
            ['blue', 'XL', 15.3, 'class1']])
df.columns = ['color', 'size', 'prize','class label']
print(df)
#哑变量处理
print(pd.get_dummies(df))

输出结果:

 

6.4 连续型变量的离散化

等宽法:cut

df = pd.DataFrame([
            ['green', 'M', 10.1, 'class1'],
            ['red', 'L', 13.5, 'class2'],
            ['blue', 'XL', 15.3, 'class1']])
df.columns = ['color', 'size', 'prize','class label']
print(df)
#哑变量处理
print(pd.get_dummies(df))

 

本章实训

使用文件: tips_mod.xls

1、导入模块

import pandas as pd import numpy as np

2、获取模块

data = pd.read_excel('data//tips_mod.xls')
print(data.head())

3、分析数据

data = pd.read_excel('data//tips_mod.xls') 
print(data.shape) 
print(data.describe())

4、显示聚餐时间段

print(data['聚餐时间段'].unique())

5、修改拼写错误的字段值

data.loc[data['聚餐时间段']=='Dier','聚餐时间段']='Dinner'
data.loc[data['聚餐时间段']=='Diner','聚餐时间段']='Dinner'
print(data['聚餐时间段'].unique())

6、检测数据中的缺失值

print(data.isnull().sum())

输出结果:

 

7、删除一行内有两个缺失值的数据

data.dropna(thresh=6,inplace=True)#因为一共是8列,有6列不缺失, 表示有两列缺失
print(data.isnull().sum())

8、删除性别或时间段为空行

data.dropna(subset=['性别','聚餐时间段'],inplace=True)
print(data.isnull().sum())

9、对剩余的空缺的数据用平均值替换

data.fillna(data.mean(),inplace=True)
print(data.isnull().sum())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值