Pandas

本文介绍了Pandas库在数据分析中的应用,包括计算统计值、排序、数据合并及缺失值处理。通过实例展示了如何使用describe()、info()、merge()、dropna()等方法进行数据探索和预处理。此外,还讲解了如何处理分类数据,利用category类型节省存储空间并进行有序排序。
摘要由CSDN通过智能技术生成

1 Pandas 数据分析入门

1 计算常用统计值

college.describe()

import numpy as np
college.describe(include=[np.object, pd.Categorical]).T

college.info()

2 常用排序方法

找到小成本高口碑电影

nlargest(100, ‘imdb_score’).nsmallest(5, ‘budget’)

找到每年imdb评分最高的电影

movie3 = movie2.sort_values([‘title_year’,‘imdb_score’], ascending=False) 同时对’title_year’,‘imdb_score’ 两列进行排序

movie_top_year = movie3.drop_duplicates(subset=‘title_year’) 指明按照title_year去重

sort_values多列排序

movie4_sorted = movie4.sort_values([‘title_year’, ‘content_rating’, ‘budget’], ascending=[False, False, True])

3 练习

替换列名

house_data.columns = ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']

也可以通过rename替换

house_data.describe()

house_data.info()

找到租金最低,和租金最高的房子

house_data.loc[house_data['price']==210000]
house_data.loc[house_data['price']==1300]
house_data[house_data['price']==house_data['price'].min()]
house_data[house_data['price']==house_data['price'].max()]

house_data.sort_values(by='price').head(1)
house_data.sort_values(by='price').tail(1)

查看所有更新时间

house_data[‘update_time’].unique()

不同看房人数的房源数量

%matplotlib inline
tmp_df[‘count’].plot(kind=‘bar’,figsize=(20,10))

看房人数最多的朝向

popular_direction = house_data.groupby(‘direction’,as_index=False)[[‘view_num’]].sum()

最受欢迎的房型

tmp = house_data.groupby(‘house_type’,as_index=False).agg({‘view_num’:‘sum’})

house_data.groupby(‘house_type’, as_index=False).agg({‘view_num’:[‘sum’, ‘min’, ‘max’], ‘price’: [‘min’, ‘max’, ‘mean’, ‘median’, ‘std’]})

添加列

house_data.loc[:,‘price_per_m2’] = house_data[‘price’]/house_data[‘area’]

address_df = house_data[[‘address’,‘view_num’]].groupby([‘address’],as_index=False).sum()

2 数据组合

1 添加行

row_concat = pd.concat([df1,df2,df3]), 会使用每个dataframe原始的行索引

pd.concat([df1,df2,df3], ignore_index=True) 不实用原始的行索引,生成新的

通过loc iloc获取数据

row_concat.iloc[3,]

row_concat.loc[3,]

使用concat连接DataFrame和Series

new_series = pd.Series([‘n1’,‘n2’,‘n3’,‘n4’])
new_row_df = pd.DataFrame([[‘n1’,‘n2’,‘n3’,‘n4’]],columns=[‘A’,‘B’,‘C’,‘D’])

concat可以连接多个对象,如果只需要向现有DataFrame追加一个对象,可以通过append函数来实现

print(df1.append(df2))

data_dict = {‘A’:‘n1’,‘B’:‘n2’,‘C’:‘n3’,‘D’:‘n4’}
df1.append(data_dict,ignore_index=True)

2 添加列

col_concat = pd.concat([df1,df2,df3],axis=1)

col_concat[‘new_col’] = [‘n1’,‘n2’,‘n3’,‘n4’]

col_concat[‘new_col_series’] = pd.Series([‘n1’,‘n2’,‘n3’,‘n4’])

print(pd.concat([df1,df2,df3],axis = ‘columns’,ignore_index=True)) 会重新命名新的列名

concat连接具有不同行列索引的数据

无论是按照index还是columns进行拼接

都会把行索引或者列名相同的拼在一起,不同的当作不同的行或者列

可以使用join参数,默认是’outer’保留所有数据,如果设置为’inner’ 只保留数据中的共有部分

3 合并多个数据集

读取数据库文件,加载数据表
from sqlalchemy import create_engine
#需要安装sqlalchemy  pip install sqlalchemy
engine = create_engine('sqlite:///data/chinook.db')
#连接数据库
tracks = pd.read_sql_table('tracks', engine)

merge操作

genre_track = genres.merge(tracks_subset[['TrackId','GenreId', 'Milliseconds']], on='GenreId', how='left')  

通过’GenreId’列合并数据,how参数指定连接方式

  • how = ’left‘ 对应SQL中的 left outer 保留左侧表中的所有key
  • how = ’right‘ 对应SQL中的 right outer 保留右侧表中的所有key
  • how = ‘outer’ 对应SQL中的 full outer 保留左右两侧侧表中的所有key
  • how = ‘inner’ 对应SQL中的 inner 只保留左右两侧都有的key

计算每种类型音乐的平均时长

genre_time = genre_track.groupby('Name')['Milliseconds'].mean()
pd.to_timedelta(genre_time, unit='ms').dt.floor('s').sort_values()

计算每名用户的平均消费

合并三张表

cust_inv = cust.merge(invoice, on=‘CustomerId’).merge(ii, on=‘InvoiceId’)

DataFrame的assign方法 创建新列

total = cust_inv[‘Quantity’] * cust_inv[‘UnitPrice’]
cust_inv = cust_inv.assign(Total = total)
按照用户Id,姓名分组,分组后对总金额求和,并排序

4 join合并

join合并,依据两个DataFrame的行索引,如果合并的两个数据有相同的列名,需要通过lsuffix,和rsuffix,指定合并后的列名的后缀

将两个DataFrame的Symbol设置为行索引,再次join数据

stocks_2016.set_index(‘Symbol’).join(stocks_2018.set_index(‘Symbol’),lsuffix=’_2016’, rsuffix=’_2018’)

将一个DataFrame的Symbol列设置为行索引,与另一个DataFrame的Symbol列进行join

stocks_2016.join(stocks_2018.set_index(‘Symbol’),lsuffix=’_2016’, rsuffix=’_2018’,on=‘Symbol’)

3 缺失数据处理

1 NaN简介

Pandas中的NaN值来自NumPy库,NumPy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样

缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空串,

两个NaN也不相等

Pandas提供了isnull/isna方法,用于测试某个值是否为缺失值

Pandas的notnull/notna方法也可以用于判断某个值是否为缺失值

2 加载包含缺失的数据

加载数据时可以通过keep_default_na 与 na_values 指定加载数据时的缺失值

print(pd.read_csv(‘data/survey_visited.csv’,keep_default_na = False))

加载数据

定义函数计算缺失比例

def missing_values_table(df):

3 使用Missingno 库对缺失值进行可视化

import missingno as msno
msno.bar(train)
缺失值位置的可视化
msno.matrix(train)
热力图计算相关系数
msno.heatmap(train)

验证相关性
sorted = train.sort_values('Age')
msno.matrix(sorted)

4 缺失值处理

删除

按行删除:删除包含缺失值的记录,

train_1.dropna(subset=['Age'],how='any',inplace=True)
根据指定的列,如果该列中有缺失值,会把这一行删掉

按列删除

train_1.drop([‘Age’],axis = 1).head()

填充缺失值

使用常量来替换(默认值)

train_constant.fillna(0,inplace = True)

使用统计量替换

train_mean[‘Age’].fillna(train_mean[‘Age’].mean(),inplace = True)

时间序列类型数据缺失值处理

  • 用时间序列中空值的上一个非空值填充
    • city_day.fillna(method=‘ffill’,inplace=True)
  • 用时间序列中空值的下一个非空值填充
    • city_day.fillna(method=‘bfill’,inplace=True)
  • 线性插值方法
    • city_day1.interpolate(limit_direction=“both”,inplace=True)

4 整理数据

###1 melt整理数据

把宽数据转成长数据,列很多的数据,转成行很多的

把原始的列名作为新的列的值,把原始的表 中的值和新的 列一一对应

pew_long = pd.melt(pew,id_vars=‘religion’,var_name=‘income’,value_name=‘count’)

在使用melt函数转换数据的时候,也可以固定多数列,只转换少数列

bill_borad_long = pd.melt(bill_board,id_vars=['year','artist','track','time','date.entered'],
                          var_name='week',value_name='rating')
bill_borad_long

上面的数据包含了两类数据:歌曲信息、周排行信息

billboard_songs = bill_borad_long[['year','artist','track','time','date.entered']]
billboard_songs = billboard_songs.drop_duplicates()

为上面数据添加id列

billboard_songs['id'] = range(len(billboard_songs))

将id列关联到原始数据,取出每周评分部分,去掉冗余信息

billboard_ratings = bill_borad_long.merge(billboard_songs,on=['year','artist','track','time','date.entered'])
billboard_ratings = billboard_ratings[['id','week','rating']]

加载时可以通过merge再还原成原始数据

billboard_songs.merge(billboard_ratings,on=[‘id’])

###2 stack整理数据

state_fruit_tidy = state_fruit.stack().reset_index()

通过stack处理,把宽数据转成长数据
state_fruit_tidy.columns = [‘state’, ‘fruit’, ‘weight’]

3 wide_to_long整理数据

使用wide_to_long函数时,要求 1,2,3 这样的顺序信息在列名的最后,并用分隔符隔开,创建一个自定义函数,用来改变列名。将数字放到列名的最后

stubs = ['actor', 'actor_facebook_likes']
actor2_tidy = pd.wide_to_long(actor2, 
                              stubnames=stubs, 
                              i=['movie_title'], 
                              j='actor_num', 
                              sep='_').reset_index()
actor2_tidy.head()

4 unstack 处理数据

unstack可以将stack的结果恢复

5 Pandas 数据类型

1 Numpy 介绍

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

2 Numpy 的ndarray属性和类型

属性名字属性解释
ndarray.shape数组维度的元组
ndarray.ndim数组维数
ndarray.size数组中的元素数量
ndarray.itemsize一个数组元素的长度(字节)
ndarray.dtype数组元素的类型

3 Pandas的数据类型

Pandas 是基于Numpy的,很多功能都依赖于Numpy的ndarray实现的,Pandas的数据类型很多与Numpy类似,属性也有很多类似

tips[‘sex_str’] = tips[‘sex’].astype(str),无法处理异常情况

to_numeric函数,to_numeric函数有一个参数errors,它决定了当该函数遇到无法转换的数值时该如何处理

to_numeric向下转型,精度变低

4 分类数据(category)

category占用空间小

利用category排序

  • 利用pd.Categorical()创建categorical数据,Categorical()常用三个参数

    • 参数一 values,如果values中的值,不在categories参数中,会被NaN代替
    • 参数二 categories,指定可能存在的类别数据
    • 参数三 ordered, 是否指定顺序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值