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, 是否指定顺序