Pandas基础(三)
一、本课目标
掌握DataFrame的特点和使用 掌握Pandas分析CSV文件 掌握Pandas分析JSON文件 掌握Pandas数据清洗 掌握Pandas常用函数
十四、CSV 文件-1
CSV(Comma-Separated Values,逗号分隔值,也称为字符分隔值,因为分隔字符也可以不是逗号) 以纯文本形式存储表格数据 CSV 是一种通用的、相对简单的文件格式,被商业和科学广泛应用 打开CSV文件
df = pd.read_csv(‘nba.csv’) print(df.to_string()) 注意to_string()的作用
df = pd. read_csv( "pandas数据文件/nba.csv" )
print ( df)
print ( df. to_string( ) )
十五、CSV 文件-2
to_csv() 方法将 DataFrame 存储为 csv 文件
name = [“Google”, “Baidu”, “Taobao”, “Wiki”] site = [“www.google.com”, “www.baidu.com”, “www.taobao.com”, “www.wiki.org”] age = [90, 40, 80, 98] dict = {‘name’: name, ‘site’: st, ‘age’: age} df = pd.DataFrame(dict) #保存 dataframe df.to_csv(‘site.csv’,head=True,index=True,index_label=’ind’)
names = [ 'Tom' , 'jack' , 'rose' ]
chinese = [ 99 , 90 , 89 ]
math = [ 100 , 80 , 90 ]
df = pd. DataFrame( { 'name' : names, 'chinese' : 'chinese' , 'math' : math} )
print ( df)
df. to_csv( "pandas数据文件/data.csv" , index= False )
df = pd. read_csv( "pandas数据文件/data.csv" )
print ( df)
十六、JSON
JSON(JavaScript Object Notation),是存储和交换文本信息的语法 JSON 比 XML 更小、更快,更易解析 打开JSON文件
df = pd.read_json(‘sites.json’) print(df.to_string()) 注意to_string()方法的作用
pd. read_json( "pandas数据文件/data.json" )
names = [ 'Tom' , 'jack' , 'rose' ]
chinese = [ 99 , 90 , 89 ]
math = [ 100 , 80 , 90 ]
df = pd. DataFrame( { 'name' : names, 'chinese' : 'chinese' , 'math' : math} )
df. to_json( "pandas数据文件/data1.json" )
十七、数据清洗-1
数据清洗是对一些没有用的数据进行处理的过程 很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理
df = pd. read_csv( "pandas数据文件/property-data.csv" , na_values= [ 'na' , '--' , 'HURLEY' ] )
print ( df. to_string( ) )
print ( '*' * 60 )
print ( df. isna( ) . to_string( ) )
print ( df. fillna( 1234556 ) . to_string( ) )
print ( df[ "NUM_BEDROOMS" ] . fillna( "Y" ) . to_string)
十八、数据清洗-2
空值数据( property-data.csv )
包含了五种空数据:(空白)、n/a、NA、—、na
df2 = df. dropna( how= 'all' )
print ( df2)
print ( '*' * 30 )
df2 = df. dropna( how= 'any' )
print ( df2)
十九、数据清洗-3
通过 isnull() 判断各个单元格是否为空 通过 dropna() 删除包含空数据的行或指定列包含空数据的行
df = pd.read_csv(‘property-data.csv’) print (df[‘NUM_BEDROOMS’]) print (df[‘NUM_BEDROOMS’].isnull()) missing_values = [“n/a”, “na”, “–”] df = pd.read_csv(‘property-data.csv’, na_values = missing_values) print (df[‘NUM_BEDROOMS’]) print (df[‘NUM_BEDROOMS’].isnull()) new_df = df.dropna() 或 df.dropna(subset=[‘ST_NUM’]) print (new_df)
df2 = df. dropna( subset= [ "NUM_BEDROOMS" , "NUM_BATH" ] )
print ( df2)
二十、数据清洗-4
通过 fillna() 方法来替换一些空字段
df.fillna(12345) df [ [ ‘PID’,’ST_NUM’ ] ] .fillna(12345) df[[“PID”,“ST_NUM”]].fillna({‘PID’:12345,‘ST_NUM’:23456}) 替换空单元格的常用方法是计算列的均值、中位数或众数
mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数(排序后排在中间的数)和众数(出现频率最高的数)
df = pd. DataFrame( [ 1 , 2 , 3 , 4 , 5 , 6 ] , columns = [ "c1" ] )
print ( df[ "c1" ] . mean( ) )
print ( df[ "c1" ] . sum ( ) / df[ "c1" ] . count( ) )
print ( df[ "c1" ] . mode( ) . mean( ) )
df = pd. read_csv( "pandas数据文件/property-data.csv" , na_values= [ 'na' , '--' , 'HURLEY' ] )
print ( df. to_string( ) )
print ( '*' * 60 )
avg_bedrooms = df[ "NUM_BEDROOMS" ] . mode( )
print ( type ( avg_bedrooms) )
print ( avg_bedrooms. loc[ 0 ] )
print ( df[ "NUM_BEDROOMS" ] . fillna( avg_bedrooms[ 0 ] ) )
avg_bath = df[ "NUM_BATH" ] . mean( )
print ( type ( avg_bath) )
print ( avg_bath)
print ( df[ "NUM_BATH" ] . fillna( round ( avg_bath, 1 ) ) )
avg_sqft = df[ "SQ_FT" ] . median( )
print ( avg_sqft)
print ( df[ "SQ_FT" ] . fillna( avg_sqft) )
df = pd. read_csv( "pandas数据文件/property-data.csv" , na_values= [ 'na' , '--' , 'HURLEY' ] )
print ( df. to_string( ) )
print ( '*' * 60 )
df1 = df. loc[ 4 , "PID" ] = 100005000.0
print ( df)
二十一、数据清洗-5
数据格式错误的单元格会使数据分析变得困难,甚至不可能
#第三个日期格式错误 data = { “Date”: [‘2020/12/01’, ‘2020/12/02’ , ‘20201226’], “duration”: [50, 40, 45] } d f = pd.DataFrame(data, index = [“day1”, “day2”, “day3”]) df[‘Date’] = pd.to_datetime(df[‘Date’], format=‘mixed’) print(df.to_string())
data = { "Date" : [ '2020/12/01' , '2020/12/02' , '20201226' ] , "duration" : [ 50 , 40 , 45 ] }
df = pd. DataFrame( data, index = [ "day1" , "day2" , "day3" ] )
df[ 'Date' ] = pd. to_datetime( df[ 'Date' ] , format = 'mixed' )
print ( df. to_string( ) )
二十二、数据清洗-6
数据错误也是很常见的情况,可以对错误的数据进行替换或移除
person = { “name”: [‘Google’, ‘Bdqn’ , ‘Taobao’], “age”: [50, 40, 12345]} df = pd.DataFrame(person) df.loc[2, ‘age’] = 30 # 修改数据 print(df.to_string()) person = { “name”: [‘Google’, ‘Runoob’ , ‘Taobao’], “age”: [50, 200, 12345]} df = pd.DataFrame(person) for x in df.index: if df.loc[x, “age”] > 120: df.loc[x, “age”] = 120 或 df.drop(x,inplace=True) # 修改数据或删除行 print(df.to_string())
person = { "name" : [ 'Google' , 'Bdqn' , 'Taobao' ] , "age" : [ 50 , 40 , 12345 ] }
df = pd. DataFrame( person)
print ( df)
print ( "*" * 30 )
df. loc[ 2 , 'age' ] = 30
print ( df. to_string( ) )
person = { "name" : [ 'Google' , 'Runoob' , 'Taobao' ] , "age" : [ 50 , 200 , 12345 ] }
df = pd. DataFrame( person)
for x in df. index:
if df. loc[ x, "age" ] > 120 :
df. loc[ x, "age" ] = 120
print ( df. to_string( ) )
二十三、数据清洗-7
如果我们要清洗重复数据,可以使用 duplicated() 和drop_duplicates() 方法 如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False
person = { “name”: [‘Google’, ‘Baidu’, ‘Baidu’, ‘Taobao’], “age”: [50, 40, 40, 23] }d f = pd.DataFrame(person) print(df.duplicated()) 或df. drop_duplicates(inplace = True) print(df.to_string())
person = { "name" : [ 'Google' , 'Baidu' , 'Baidu' , 'Taobao' ] , "age" : [ 50 , 40 , 40 , 23 ] }
df = pd. DataFrame( person)
print ( df. to_string)
print ( "*" * 20 )
print ( df. duplicated( ) )
print ( "*" * 20 )
df. drop_duplicates( inplace = True )
print ( df)
df = pd. read_excel( "pandas数据文件/Data.xlsx" )
print ( df)
二十四、数据清洗-8
清洗空值数据
删除包含空字段的行,可以使用 dropna() 方法 清洗格式错误数据
清洗错误数据
清洗重复数据
可以使用 duplicated() 和 drop_duplicates() 方法
二十五、常用函数-1
函数 说明 pd.read_csv(filename) 读取 CSV 文件; pd.read_excel(filename) 读取 Excel 文件; pd.read_sql(query, connection_object) 从 SQL 数据库读取数据; pd.read_json(json_string) 从 JSON 字符串中读取数据;
二十六、常用函数-2
函数 说明 df.head(n) 显示前 n 行数据; df.tail(n) 显示后 n 行数据; df.info() 显示数据的信息, 包括列名、 数据类型、 缺失值等; df.describe() 显示数据的基本统计信息, 包括均值、 方差、 最大值最小值等; df.shape 显示数据的行数和列数。
二十七、常用函数-3
函数 说明 df.dropna() 删除包含缺失值的行或列; df.fillna(value) 将缺失值替换为指定的值; df.replace(old_value, new_value) 将指定值替换为新值; df.duplicated() 检查是否有重复的数据; df.drop_duplicates() 删除重复的数据。
二十八、常用函数-4
函数 说明 df[column_name] 选择指定的列; df.loc[row_index, column_name] 通过标签选择数据; df.iloc[row_index, column_index] 通过位置选择数据; df.ix[row_index, column_name] 通过标签或位置选择数据; df.filter(items=[column_name1, column_name2]) 选择指定的列; df.filter(regex=‘regex’) 选择列名匹配正则表达式的列; df.sample(n) 随机选择 n 行数据。
二十九、常用函数-5
函数 说明 df.sort_values(column_name) 按照指定列的值排序; df.sort_values([column_name1, column_name2], ascending=[True, False]) 按照多个列的值排序; df.sort_index() 按照索引排序。
三十、常用函数-6
函数 说明 df.groupby(column_name) 按照指定列进行分组; df.aggregate(function_name) 对分组后的数据进行聚合操作;
三十一、常用函数-7
函数 说明 df.loc[row_indexer, column_indexer] 按标签选择行和列。 df.iloc[row_indexer, column_indexer] 按位置选择行和列。 df[df[‘column_name’] > value] 选择列中满足条件的行。 df.query(‘column_name > value’) 使用字符串表达式选择列中满足条件的行。
三十二、常用函数-8
函数 说明 df.describe() 计算基本统计信息, 如均值、 标准差、 最小值、 最大值等 df.mean() 计算每列的平均值。 df.median() 计算每列的中位数。 df.mode() 计算每列的众数。 df.count() 计算每列非缺失值的数量。
三十三、练习
data = [
{ "name" : "Google" , "likes" : 25 , "url" : "https://www.google.com" } ,
{ "name" : "Baidu" , "likes" : 30 , "url" : "https://www.baidu.com" } ,
{ "name" : "Taobao" , "likes" : 35 , "url" : "https://www.taobao.com" }
]
df = pd. DataFrame( data)
print ( df. head( 2 ) )
print ( df. tail( 1 ) )
df = pd. read_json( 'data.json' )
print ( df)
df = df. dropna( )
print ( df)
df = df. fillna( { 'age' : 0 , 'score' : 0 } )
print ( df)
df = df. rename( columns= { 'name' : '姓名' , 'age' : '年龄' , 'gender' : '性别' , 'score' : '成绩' } )
print ( df)
df = df. sort_values( by= '成绩' , ascending= False )
print ( df)
grouped = df. groupby( '性别' ) . agg( { '年龄' : 'mean' , '成绩' : 'mean' } )
print ( grouped)
df = df. loc[ df[ '成绩' ] >= 90 , [ '姓名' , '成绩' ] ]
print ( df)
stats = df. describe( )
print ( stats)
mean = df[ [ '年龄' , '成绩' ] ] . mean( )
print ( mean)
median = df[ [ '年龄' , '成绩' ] ] . median( )
print ( median)
mode = df. mode( )
print ( mode)
count = df. count( )
print ( count)
三十四、总结
掌握DataFrame的特点和使用 掌握Pandas分析CSV文件 掌握Pandas分析JSON文件 掌握Pandas数据清洗 掌握Pandas常用函数