Pandas数据载入与预处理

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,数据库

Pandas数据载入与预处理

Pandas数据载入与预处理

二、数据合并

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))

输出结果:

Pandas数据载入与预处理

1.1 内连接-inner

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

输出结果:

Pandas数据载入与预处理

1.2 外连接–outer

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

输出结果:

Pandas数据载入与预处理

1.3 左连接-left

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

输出结果:

Pandas数据载入与预处理

1.4 右连接-right

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

输出结果:

Pandas数据载入与预处理

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

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

输出结果:

Pandas数据载入与预处理

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]))

输出结果:

Pandas数据载入与预处理

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)

输出结果:

Pandas数据载入与预处理

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)

输出结果:

Pandas数据载入与预处理

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

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

输出结果:

Pandas数据载入与预处理

三、数据清洗

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())

输出结果:

Pandas数据载入与预处理

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())

Pandas数据载入与预处理

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

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

输出结果:

Pandas数据载入与预处理

2、缺失值的处理

删除缺失值 -dropna()

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

dropna方法的格式:

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

Pandas数据载入与预处理

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)

Pandas数据载入与预处理

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())

Pandas数据载入与预处理

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))

输出结果:

Pandas数据载入与预处理

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)

输出结果:

Pandas数据载入与预处理

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)

输出结果:

Pandas数据载入与预处理

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)

输出结果:

Pandas数据载入与预处理

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

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

输出结果:

Pandas数据载入与预处理

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())

输出结果:

Pandas数据载入与预处理

4.2 删除重复的行— drop_duplicates()

Pandas数据载入与预处理
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:" '中' else: '差' df['等级']="df['&#x6210;&#x7EE9;'].map(grade)" print(df)< code></=x<90:>

6、数据的标准化

6.1 离差标准化数据

Pandas数据载入与预处理
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('&#x539F;&#x59CB;&#x6570;&#x636E;&#x4E3A;:\n',x)
x_sc=MinMaxScale(x)
print('&#x6807;&#x51C6;&#x5316;&#x540E;&#x77E9;&#x9635;&#x4E3A;:\n',x_sc)

6.2 标准差标准化数据

Pandas数据载入与预处理
def StandardScale(data):
    data = (data-data.mean())/data.std()
    return data
x = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
print('&#x539F;&#x59CB;&#x6570;&#x636E;&#x4E3A;:\n',x)
x_sc = StandardScale(x)
print('&#x6807;&#x51C6;&#x5316;&#x540E;&#x77E9;&#x9635;&#x4E3A;:\n',x_sc)

输出结果:

Pandas数据载入与预处理

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)
#&#x54D1;&#x53D8;&#x91CF;&#x5904;&#x7406;
print(pd.get_dummies(df))

输出结果:

Pandas数据载入与预处理

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)
#&#x54D1;&#x53D8;&#x91CF;&#x5904;&#x7406;
print(pd.get_dummies(df))

Pandas数据载入与预处理

本章实训

使用文件: 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['&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;'].unique())

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

data.loc[data['&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;']=='Dier','&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;']='Dinner'
data.loc[data['&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;']=='Diner','&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;']='Dinner'
print(data['&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;'].unique())

6、检测数据中的缺失值

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

输出结果:

Pandas数据载入与预处理

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

data.dropna(thresh=6,inplace=True)#&#x56E0;&#x4E3A;&#x4E00;&#x5171;&#x662F;8&#x5217;&#xFF0C;&#x6709;6&#x5217;&#x4E0D;&#x7F3A;&#x5931;&#xFF0C; &#x8868;&#x793A;&#x6709;&#x4E24;&#x5217;&#x7F3A;&#x5931;
print(data.isnull().sum())

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

data.dropna(subset=['&#x6027;&#x522B;','&#x805A;&#x9910;&#x65F6;&#x95F4;&#x6BB5;'],inplace=True)
print(data.isnull().sum())

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

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

Original: https://blog.csdn.net/luyufen_luise/article/details/126213875
Author: 华为大数据
Title: Pandas数据载入与预处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/753532/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球