通用
s.reindex (新的索引, method = ..., column= ....) 修改索引以及column method 参数:(None:任性不填 'pad'/'ffill':用前面数填充后面的缺失值 backfill'/'bfill':用后面数填充前面的缺失值 nearest':用最近的数填充,这个是最靠谱的)
obj.drop(x, axis = ) 删除某个值,丢弃指定轴上的项
1/df1 = df1.rdiv(1)
s.sort_index(axis=...,ascending = ....)
s.sort_values(by=...)
s.rank(method=..., ascending = ...,axis = ....) method = average, min, max, first, dense
obj.index.is_unique()
obj.describe()
obj.isin([....]) 判断是否在【】里面 ,返回布尔值
obj.get_indexer() 返回索引值
pd.options.display.max_rows = 10 设置行间隔
import json json.dumps() 将python对象转换成json 格式
pd.read_json 可以自动将特别格式的json数据集转换为Series或Dataframe
x.to_json 将数据从pandas输出到json
x.getroot 得到xml文件的根节点的引用
root.INDICATOR 返回一个用于产生各个xml元素的生成器
x. getchildren 按照文档顺序返回所有子标签
StringIO 就是在内存中读写str
pd.get_dummies(x,prefix=....) 可以用来计算哑变量, prefix 在列名上加上前缀
x.join() 可以将两个dataframe 合并
pd.get_dummies(pd.cut(values, bins)) 分组,
series
创建series
#%% 创建series # 传统方法创建 # index 为前10 个 大写字母 string.ascii_uppercase[:10] t = pd.Series(np.arange(10),index = list(string.ascii_uppercase[:10])) print(type(t)) # <class 'pandas.core.series.Series'> # 由字典转换为series a = {string.ascii_uppercase[i]: i for i in range(10)} a_s = pd.Series(a) b = pd.Series(a,index = list(string.ascii_uppercase[5:15])) print(b.dtype) #float64 因为有nan存在
series的切片和索引 复合索引
#%% series 的切片和索引 print(t[1]) # 取一个值 print(t[2:10:2]) # 取索引2 - 10 步长为2 的值 print(t[[2,3,6]]) # 取 第2,3,6 的值 print(t[t>4]) # 布尔取值 print(t['F']) # 按索引自取值 print(t[['A','F','G']]) #同上
x['one','h'] 直接在括号里面写索引即可
x.swaplevel()['h'] 转换复合索引的等级
查看series的值
#%% 查看series的值 print(t.index) print(t.values) print(type(t.index)) # <class 'pandas.core.indexes.base.Index'> print(type(t.values)) #<class 'numpy.ndarray'>
DataFrame
基本属性
df.shape 行列数
df.dtypes 列数据类型
df.ndim 数据维度
df.index 行索引
df.columns 列索引
df.values 对象值,转为数组
df.head(3) 显示头部几行,默认5行
df.tail(3) 显示尾部几行,默认5行
df.info() 相关信息浏览
df.describe() 快速显示统计结果
df.sort_values(by="Count_AnimalName",ascending=False) 排序
pd.read_csv('examples/ex6.csv', nrows=5) 指定读取几行
创建
df= pd.DataFrame(np.arange(12).reshape((3,4))) df2 = pd.DataFrame(np.arange(12).reshape((3,4)),index = list('abc'),columns = list('wxyz')) # 由字典创建 d1 = {'name':['ady','cindy','wendy'], 'age':[11,12,13], 'tel':[113,118,119]} df3 = pd.DataFrame(d1) d2 = [{'name':'selina','age':13,'tel':1134}, {'name':'adelina','age':16,'tel':1135}, {'age':18,'tel':1164}] df4 = pd.DataFrame(d2) # 上述没有填的地方会转为nan
切片+索引
df_sorted[:100] 选择行
df[:100][" Count_AnimalName "] 选择行+列
LOC
t.loc['A','W'] 选择行+列 指定某个值
t.loc['A',['w','z']] 选择多列 单行 指定某几个值
t.loc[['A','C'],['W','Z']] 选择间隔的多行多列
t.loc['A': , ['W','Z']] t.loc ['A':'C', ['W','Z']] 冒号在loc里面是指闭合的
iloc 与loc 类似,转变为了数字
布尔索引: df [df['Count_AnimalName']>800]
且为 & 或为| dog_name[(dog_name['Count_AnimalName']>700)&(dog_name['Row_Labels'].str.len()>4)]
缺失数据的处理
判断是否为nan pd.isnull(df) pd.notnull(df)
处理方式:
删除Nan 所在的行列 : dropna(axis= 0,how = 'any' ,inplace = False) how = any:只要存在nan 就删掉 how = all 是指整行或整列都是nan的时候删掉 inplace 是指是否原地替换
填充数据 : t.fillna(t.mean()) t.fillna(t.median()) t.fillna(0)
处理为0的数据 : t[t==0] = np.nan
数据合并 join&merge
#%%数据合并 #join 把行索引相同的数据合并到一起 t2 = pd.DataFrame(np.zeros((2,5)),index = list('AB'),columns = list('VWXYZ')) t1 = pd.DataFrame(np.zeros((3,4)),index = list('ABC'),columns = range(4)) t3 = t1.join(t2) #%%merge 按照指定的列吧数据按照一样的方式合并到一起 t1 = pd.DataFrame(np.ones((3,4)),index = list('ABC'),columns = list('MNOP')) t1['O'] = list('abc') t2 = pd.DataFrame(np.zeros((2,5)),index = list('AB'),columns = list('VWXYZ')) t2['X']=list('cd') # 并集 t3 = t1.merge(t2,left_on='O',right_on='X',how = 'inner') # 相当于sql 的join how 不写的话 默认为inner t4 = t1.merge(t2,left_on='O',right_on='X',how = 'outer') # 并集 t5 = t1.merge(t2,left_on='O',right_on='X',how = 'left') # 左边为准的补全 t6 = t1.merge(t2,left_on='O',right_on='X',how = 'right') #右边为准的补全
一个movie 的案例
# 数据来源 import pandas as pd from pymongo import MongoClient import numpy as np import string from matplotlib import pyplot as plt #%% client = MongoClient() collection = client['douban']['tv1'] data = list(collection.find()) t1 = data[0] t1 = pd.Series(t1) print(data) print(t1) #%% 读取数据 dog_name = pd.read_csv('/Users/qqb/Downloads/dogNames2.csv',error_bad_lines=False) #pd.read_sql(sql_sentence,connection) #%% movie = pd.read_csv('/Users/qqb/Downloads/datasets_1474_2639_IMDB-Movie-Data.csv') info = movie.info() #%%平均分 mean_score = movie['Rating'].mean() #演员人数 temp_list = movie['Actors'].str.split(',').tolist() # tolist 是把series变成list nums = len(set([i for j in temp_list for i in j])) # 先把大list里的每个小list 提取出来 然后再 将小list中的元素提取出来,最后用集合去除重复项 di = movie['Director'].unique() # 电影时长的最大最小值 run_max = movie['Runtime (Minutes)'].max() # 取出最大的那个值 run_max_index = movie['Runtime (Minutes)'].argmax() # 取出最大值所对应的索引 run_min = movie['Runtime (Minutes)'].min() run_min_index = movie['Runtime (Minutes)'].argmin() run_median = movie['Runtime (Minutes)'].median() #%% plt.figure(figsize=(20,8),dpi=80) num_bin = (movie['Runtime (Minutes)'].max()- movie['Runtime (Minutes)'].min())//5 plt.hist(movie['Runtime (Minutes)'],num_bin) plt.xticks(range(movie['Runtime (Minutes)'].min(),movie['Runtime (Minutes)'].max()+5,5)) plt.show() #%% movie = pd.read_csv('/Users/qqb/Downloads/datasets_1474_2639_IMDB-Movie-Data.csv') #平均分 num_bin_list = np.arange(movie['Rating'].min(),movie['Rating'].max()+0.5,0.5) print(num_bin_list) num_list = np.arange(3.1,3.1+13*0.5,0.5).tolist() plt.figure(figsize=(20,8),dpi=80) plt.hist(movie['Rating'],num_list) print(num_list) plt.xticks(num_list,num_list) plt.show() #%%统计分类的列表 as_movie = movie['Genre'].str.split(',').tolist() genre_list = list(set(i for j in as_movie for i in j)) # 构建全为0 的数组 zero_movie = pd.DataFrame(np.zeros((movie.shape[0],len(genre_list))),columns = genre_list) print(zero_movie) # 给每个电影出现分类的地方赋值1 !!! for i in range(movie.shape[0]): zero_movie.loc[i,as_movie[i]]=1 # 统计每个电影分类的数量和 sum_movie = zero_movie.sum(axis=0) # 排序 画图 rank_movie = sum_movie.sort_values() plt.figure(figsize=(20,8),dpi = 80) plt.bar(range(len(rank_movie.index)),rank_movie) # 最好x轴先传数字,后期方便调整 plt.xticks(range(len(rank_movie.index)),rank_movie.index)
案例:星巴克
star = pd.read_csv('/Users/qqb/Downloads/directory.csv') star.info() #%%分组与聚合 c_star=star.groupby(by='Country') # 该对象可以进行遍历和调用聚合方法 # for i in c_star: # print(i) # i 为元祖类型 # for i,j in c_star: # print(i) # i 为str # print(j) # j 为dataframe cc = c_star['Brand'].count() #%%美国 中国 哪个地方星巴克多 china = cc['CN'] us = cc['US'] #%% 中国每个省份星巴克的数量 china_data = star[star['Country']=='CN'] china_group = china_data.groupby(by = 'State/Province').count()['Brand'] plt.figure(figsize=(20,8),dpi = 80) plt.bar(china_group.index,china_group) plt.show() #%%数据按照多个条件进行分组 #返回series grouped = star['Brand'].groupby(by=[star['Country'],star['State/Province']]).count() # 这样之后 country 和 state 变成了索引 print(grouped) #返回Dataframe grouped1 = star.groupby(by=[star['Country'],star['State/Province']])[['Brand']].count() grouped2 = star.groupby(by=[star['Country'],star['State/Province']]).count()[['Brand']] # 上述 只要['Brand'] 为series 如果是【['Brand']】 为Dataframe 形式 #%% 使用matplotlib 呈现出店铺总排名前10 的国家 #准备数据 top10 = star.groupby(by = 'Country').count()['Brand'].sort_values(ascending=False)[:10] # 画图 plt.figure(figsize=(20,8),dpi = 80) plt.bar(range(len(top10.index)),top10.values) plt.xticks(range(len(top10.index)),top10.index) #%% 呈现中国每个城市店铺的数量 china_star =star[star['Country']=='CN'] city_star = china_star.groupby(by = 'City').count()['Brand'].sort_values(ascending=False)[:50] plt.figure(figsize=(50,8),dpi = 80) plt.bar(range(len(city_star.index)),city_star.values) plt.xticks(range(len(city_star.index)),city_star.index,rotation=90) plt.show()
分组与聚合
df.groupby(by='columns_name') 得到聚合对象, 可以调用聚合方法以及遍历
df.groupby(by='columns_name').count()
多标准分组:
grouped = df.groupby(by=[df["Country"],df["State/Province"]])
获取分组之后的某一部分数据:
df.groupby(by=["Country","State/Province"])["Country"].count()
对某几列数据进行分组:
df["Country"].groupby(by=[df["Country"],df["State/Province"]]).count()
索引与复合索引
获取index:df.index
指定index :df.index = ['x','y']
重新设置index : df.reindex(list("abcedf"))
指定某一列作为index :df.set_index("Country",drop=False) x = a.set_index(['c','d'])[['a']]
返回index的唯一值:df.set_index("Country").index.unique()
符合索引,交换索引的层级: df.swaplevel()
x.loc['one']
x.loc['one'].loc['h']
时间序列
pd.date_range(start=None, end=None, periods=None, freq='D') period是指列几个
日期的重采样:t.resample('M').mean() M可换为10D之类
书本案例
#%% 导入数据 https://www.kaggle.com/zygmunt/goodbooks-10k book=pd.read_csv('/Users/qqb/Downloads/1938_3914_bundle_archive/books.csv') book.info() #%% 因为年份是有缺失值的,所以先删掉哪一行 book_new = book[pd.notnull(book['original_publication_year'])] book_new.info() #%% 统计不同年份输的数量 year_book = book_new.groupby(by = 'original_publication_year').count()['id'].sort_values(ascending=False) plt.plot(range(len(year_book.index)),year_book.values) plt.xticks(range(len(year_book.index)),year_book.index) #%%不同年份书的平均评分情况 year_rating = book_new['average_rating'].groupby(by=book_new['original_publication_year']).mean() plt.plot(range(len(year_rating.index)),year_rating.values) plt.xticks(list(range(len(year_rating.index)))[::10],year_rating.index[::10].astype(int),rotation=45)
紧急电话案例
不同类型的紧急情况的次数,如果我们还想统计出不同月份不 同类型紧急电话的次数的变化情况
#%% 911 紧急电话 emergency=pd.read_csv('/Users/qqb/Downloads/911.csv') #%% print(emergency.info()) # 获取分类 type_e = emergency['title'].str.split(':').tolist() type_emergency = list(set([i[0] for i in type_e])) #%% 构造全为0 的数组 ze = pd.DataFrame(np.zeros((emergency.shape[0],len(type_emergency))),columns=type_emergency) a=emergency['title'].str.contains('EMS') for t in type_emergency: ze[t][emergency['title'].str.contains(t)]=1 # 这个方法快很多 #%% # for i in range(emergency.shape[0]): # ze.loc[i,type_e[i][0]] = 1 # #%% sum_ret = ze.sum(axis=0) #%% 简便方式 emergency['cate']=[i[0] for i in type_e] grouped = emergency.groupby(by='cate').count()[''] #%% 不同月份不同类型的紧急电话的分布情况 # https://blog.csdn.net/shomy_liu/article/details/44141483 emergency['timeStamp']=pd.to_datetime(emergency["timeStamp"],format='%Y-%m-%d') #%% emergency.set_index('timeStamp',inplace=True) #%% mon = emergency.resample('M').count()['title'] print(emergency.head()) print(mon) #%% 画图 plt.figure(figsize=(20,8),dpi=80) x = [i.strftime('%Y-%m-%d') for i in mon.index] plt.plot(range(len(mon.index)),mon.values) plt.xticks(range(len(mon.index)),x,rotation=90) #%% 不同月份不同种类的紧急电话 # 将时间设置为索引 emergency['timeStamp']=pd.to_datetime(emergency["timeStamp"],format='%Y-%m-%d') emergency.set_index('timeStamp',inplace=True) #%%添加列表示分类 type_e = emergency['title'].str.split(':').tolist() emergency['cate']=[i[0] for i in type_e]
#%% 不同月份不同紧急 #导入数据 emergency=pd.read_csv('/Users/qqb/Downloads/911.csv') emergency.info() #%% type_e = emergency['title'].str.split(':') emergency['cate']=[i[0] for i in type_e] #%% 转为时间时间格式并设置为索引 emergency['timeStamp']=pd.to_datetime(emergency["timeStamp"],format='%Y-%m-%d') emergency.set_index('timeStamp',inplace = True) #%% plt.figure(figsize=(20,8),dpi=80) for a,b in emergency.groupby(by = 'cate'): _x = [i.strftime('%Y-%m-%d') for i in b.index] c = b.resample('M').count()['title'] plt.plot(range(len(c.index)),c.values,label=a) plt.xticks(range(len(c.index)),_x,rotation=90) plt.legend() plt.show()
PM2.5 案例
bj = pd.read_csv('/Users/qqb/Downloads/2168_3650_bundle_archive/BeijingPM20100101_20151231.csv') cd = pd.read_csv('/Users/qqb/Downloads/2168_3650_bundle_archive/ChengduPM20100101_20151231.csv') gz = pd.read_csv('/Users/qqb/Downloads/2168_3650_bundle_archive/GuangzhouPM20100101_20151231.csv') sh = pd.read_csv('/Users/qqb/Downloads/2168_3650_bundle_archive/ShanghaiPM20100101_20151231.csv') sy = pd.read_csv('/Users/qqb/Downloads/2168_3650_bundle_archive/ShenyangPM20100101_20151231.csv') #%% bj.info() bj_new.info() #%% periodindex 时间段 # periods = pd.PeriodIndex(year=data["year"],month=data["month"],day=data["day"],hour=data["hour"],freq="H") # data = df.set_index(periods).resample("10D").mean() bj_hour = pd.PeriodIndex(year = bj['year'],month = bj['month'],day = bj['day'],hour=bj['hour'],freq='H') bj['bj_hour']=bj_hour cd_hour = pd.PeriodIndex(year = cd['year'],month = cd['month'],day = cd['day'],hour=cd['hour'],freq='H') cd['bj_hour']=cd_hour bj.set_index('bj_hour',inplace=True) #%% # 处理缺失数据,删除缺失数据 bj_new = bj[pd.notnull(bj['PM_US Post'])] bj_to = bj['PM_US Post'] #%%重采样 bj = bj.resample('M').mean() #%% 中国数据 bj_china = bj['PM_Dongsi'] #%%绘图 plt.figure(figsize = (20,8),dpi=80) plt.plot(range(len(bj.index)),bj['PM_US Post']) plt.plot(range(len(bj_china.index)),bj_china.values) plt.xticks(range(len(bj.index)),bj.index,rotation=90) plt.show()
相关系数与协方差