Python数据挖掘Pandas怎么理解,包括哪些操作及要点
Admin 2022-07-27 群英技术资讯 335 次浏览
核心数据结构
DataFrame是一个既有行索引又有列索引的二维数据结构
import numpy as np import pandas as pd a=np.ones((2,3)) b=pd.DataFrame(a) print(a) print(b)
如图,生成的打他frame是一个二维表,由于没有指定索引,因此默认行列索引为数字序号
1.获取局部展示
b.head()#默认展示前5行,可在head()加入数字,展示前几行 b.tail()#默认展示后5行,可在tail()加入数字,展示后几行
2.获取索引和值
import numpy as np # 创建一个符合正态分布的10个股票5天的涨跌幅数据 stock_change = np.random.normal(0, 1, (10, 5)) pd.DataFrame(stock_change) #设置行列索引 stock = ["股票{}".format(i) for i in range(10)] date = pd.date_range(start="20200101", periods=5, freq="B")#这个是pandas中设置日期的 # 添加行列索引 data = pd.DataFrame(stock_change, index=stock, columns=date) print(data)
3.设置行列索引
# 创建一个符合正态分布的10个股票5天的涨跌幅数据 stock_change = np.random.normal(0, 1, (10, 5)) pd.DataFrame(stock_change) #设置行列索引 stock = ["股票{}".format(i) for i in range(10)] date = pd.date_range(start="20200101", periods=5, freq="B")#这个是pandas中设置日期的 # 添加行列索引 data = pd.DataFrame(stock_change, index=stock, columns=date) print(data)
4.修改索引
#不能单独修改行列总某一个索引的值,可以替换整行或整列 例:b.index[2]='股票1' 错误 data.index=新行索引 #重设索引 data.reset_index(drop=False) #drop参数默认为False,表示将原来的索引替换掉,换新索引为数字递增,原来的索引将变为数据的一部分。True表示,将原来的索引删除,更换为数字递增。如下图
# 设置新索引 df = pd.DataFrame({'month': [1, 4, 7, 10], 'year': [2012, 2014, 2013, 2014], 'sale':[55, 40, 84, 31]}) # 以月份设置新的索引 df.set_index("month", drop=True) #见下图,即将原本数据中的一列拿出来作为index new_df = df.set_index(["year", "month"])# 设置多个索引,以年和月份 多个索引其实就是MultiIndex
可以看到下面的new_df已经是multiIndex类型数据了。
有三级:index index.names index.levels
分别看各自的输出
MultiIndex:多级或分层索引对象
Panel:
pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)
存储3维数组的Panel结构
items - axis 0,每个项目对应于内部包含的数据帧(DataFrame)。 major_axis - axis 1,它是每个数据帧(DataFrame)的索引(行)。 minor_axis - axis 2,它是每个数据帧(DataFrame)的列。
Pandas从版本0.20.0开始弃用,推荐的用于表示3D数据的方法是DataFrame上的MultiIndex方法
带索引的一维数组
# 创建 pd.Series(np.arange(3, 9, 2), index=["a", "b", "c"]) # 或 pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000}) sr = data.iloc[1, :] sr.index # 索引 sr.values # 值 #####就是从dataframe中抽出一行或一列来观察 12345678910
data=pd.read_csv("./stock_day/stock_day.csv")#读入文件的前5行表示如下 ######利用drop删除某些行列,需要利用axis告知函数是行索引还是列索引 data=data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1) # 去掉一些不要的列 data["open"]["2018-02-26"] # 直接索引,但需要遵循先列后行 #####按名字索引利用.loc函数可以不遵循列行先后关系 data.loc["2018-02-26"]["open"] # 按名字索引 data.loc["2018-02-26", "open"] #####利用.iloc函数可以只利用数字进行索引 data.iloc[1][0] # 数字索引 data.iloc[1,0] # 组合索引 # 获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果 data.ix[:4, ['open', 'close', 'high', 'low']] # 现在不推荐用了 ###但仍可利用loc和iloc data.loc[data.index[0:4], ['open', 'close', 'high', 'low']] data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
data仍然是上图类型
data.open=100 data['open']=100 ###两种方式均可 data.iloc[1,0]=100 ###找好索引即可
sort_values (比较values进行排序) sort_index (比较行索引进行排序,不行可以先转置简介对列排序)
data.sort_values(by="high", ascending=False) # DataFrame内容排序,ascending表示升序还是降序,默认True升序 data.sort_values(by=["high", "p_change"], ascending=False).head() # 多个列内容排序。给出的优先级进行排序 data.sort_index(ascending=True)###对行索引进行排序 #这里是取出了一列 “price_change”列,为serise,用法同上 sr = data["price_change"] sr.sort_values(ascending=False) sr.sort_index()
布尔值索引
算术运算:直接利用运算符或者函数
#正常的加减乘除等的运算即可 data["open"] + 3 data["open"].add(3) # open统一加3 data.sub(100)# 所有统一减100 data - 100 (data["close"]-(data["open"])).head() # close减open
逻辑运算 :< ; > ; | ; & 利用逻辑符号或者函数query
# 例如筛选p_change > 2的日期数据 data[data["p_change"] > 2].head() # 完成一个多个逻辑判断, 筛选p_change > 2并且low > 15 data[(data["p_change"] > 2) & (data["low"] > 15)].head() data.query("p_change > 2 & low > 15").head()###等效于上一行代码 ###判断# 判断'turnover'列索引中是否有4.19, 2.39,将返回一列布尔值 data["turnover"].isin([4.19, 2.39])##如下图
利用布尔值索引,即利用一个布尔数组索引出True的数据
###判断# 判断'turnover'列索引中是否有4.19, 2.39,将返回一列布尔值 data["turnover"].isin([4.19, 2.39])##如下图 data[data["turnover"].isin([4.19, 2.39])] #这块就将返回turnover列布尔值为true的如下图,也就是筛选出turnover中值为4.19和2.39 ###布尔值索引是一个很方便的数据筛选操作,比如: data[data["turnover"]>0.1] #也将筛选出turnover列中大于0.1的整体data数据,并不是说只返回turnover相关数据,判断只是返回布尔索引,利用索引的是data数据
data.describe() #将返回关于列的最值,均值,方差等多种信息 ##其实这里很多就和numpy相似了 data.max(axis=0)#返回最值 data.idxmax(axis=0) #返回最值索引
累计统计函数(累加,累乘等)
自定义运算
apply(func, axis=0)
func: 自定义函数
axis=0: 默认按列运算,axis=1按行运算
data.apply(lambda x: x.max() - x.min()) #这里的lambda x: x.max() - x.min()是lambda表达式,是函数的简单写法也可 def fx(data): return data.max()-data.min()
#更简易用matplotlib data.plot(x="volume", y="turnover", kind="scatter") data.plot(x="high", y="low", kind="scatter") data['volume'].plot()
DataFrame.to_csv(path_or_buf=None,sep=','columns=None,header=True,index=True,index_label=None,mode='w',encoding=None) 1
Series.to_csv (path=None,index=True,sep=',',na_rep='',float_format=None,header=False,index_label=None,mode='w',encoding=None,compression=None,date_format=None,decimal='.)
Write Series to a comma-separated values(csv)file
pd.read_csv("./stock_day/stock_day.csv", usecols=["high", "low", "open", "close"]).head() # 读哪些列 data = pd.read_csv("stock_day2.csv", names=["open", "high", "close", "low", "volume", "price_change", "p_change", "ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20", "turnover"]) # 如果列没有列名,用names传入 data[:10].to_csv("test.csv", columns=["open"]) # 保存open列数据 data[:10].to_csv("test.csv", columns=["open"], index=False, mode="a", header=False) # 保存opend列数据,index=False不要行索引,mode="a"追加模式|mode="w"重写,header=False不要列索引
csv可以用excel表格打开,但是可能有格式错误
read_hdf to_hdf
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame,也就是说hdf5存储的是panel这种三维类型,一个key对应一个dataframe
pandas.read_hdf(path_or_buf, key=None, **kwargs)
从h5文件当中读取数据
DataFrame.to_hdf(path_or_buf, key, **kwargs)
day_close = pd.read_hdf("./stock_data/day/day_close.h5",key="close") day_close.to_hdf("test.h5",key="close" )
read_json to_json
pandas.read_json(path_or_buf=None,orient=None,typ=“frame”,lines=False)
sa = pd.read_json("Sarcasm_Headlines_Dataset.json", orient="records", lines=True) ##主要是path,orient是一种确定索引与数值的对应,以本例来看,列索引就是‘key',values就是key对应的值 sa.to_json("test.json", orient="records", lines=True)
本示例中按行存储,每行是一个字典,键 有’article_link’,'headline’等
主要参数
如何进行缺失值处理?
判断NaN是否存在
删除nan数据
替换nan数据
movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True) ###这就是先利用其他代码判断出"Revenue (Millions)"有nan数据,然后利用.fillna函数,令value=movie["Revenue (Millions)"].mean()列的均值,然后inplace=True修改原数据
import pandas as pd import numpy as np movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv") # 1)判断是否存在NaN类型的缺失值 np.any(pd.isnull(movie)) # 返回True,说明数据中存在缺失值 np.all(pd.notnull(movie)) # 返回False,说明数据中存在缺失值 pd.isnull(movie).any() pd.notnull(movie).all() # 2)缺失值处理 # 方法1:删除含有缺失值的样本 data1 = movie.dropna() pd.notnull(data1).all() # 方法2:替换 # 含有缺失值的字段 # Revenue (Millions) # Metascore movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True) movie["Metascore"].fillna(movie["Metascore"].mean(), inplace=True)
替换非nan的标记数据
有些数据不存在可能标记为“#”,“?”等
# 读取数据 path = "wisconsin.data" name = ["Sample code number", "Normal Nucleoli","Mitoses", "Class"] data = pd.read_csv(path, names=name) #这里的非nan标记值缺失值就是利用“?”表示的,因此利用参数to_replace,value=np.nan,将默认标记值替换为nan值,然后再利用签署方法处理nan缺失值 # 1)替换 data_new = data.replace(to_replace="?", value=np.nan)
这一块建议去看视频,理解更快:视频地址
1.分组
2.将分组好的结果转换成one-hot编码(哑变量)
one-hot编码:
one-hot
比如男女数据一般用1和0表示,但1和0本身有大小问题,而男女只是不同的概念,因此用1,0表示会存在区别
(男:1 女:0) | 性别 |
---|---|
小明 | 1 |
小红 | 0 |
如果用one-hot表示一种方法可以是,相当于利用一种编码的方式表示
男 | 女 | 编码 | |
---|---|---|---|
小明 | 1 | 0 | 1 0 |
小红 | 0 | 1 | 0 1 |
同时还可处理连续数据,比如将身高的连续数据分为不同的身高区间,每个区间对应一个类别,然后类比同上来考虑
# 1)准备数据 data = pd.Series([165,174,160,180,159,163,192,184], index=['No1:165', 'No2:174','No3:160', 'No4:180', 'No5:159', 'No6:163', 'No7:192', 'No8:184']) # 2)分组 # 自动分组 sr = pd.qcut(data, 3) sr.value_counts() # 看每一组有几个数据 # 3)转换成one-hot编码 pd.get_dummies(sr, prefix="height") # 自定义分组 bins = [150, 165, 180, 195]#这就表示有三组[150,165][165,180][180,195] sr = pd.cut(data, bins) # get_dummies pd.get_dummies(sr, prefix="身高")
指合并不同dataframe上的内容数据
按方向
pd.concat([data1, data2], axis=1) #axis:0为列索引;1为行索引
按索引
merge函数参数API
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], 'key2': ['K0', 'K0', 'K0', 'K0'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) pd.merge(left, right, how="inner", on=["key1", "key2"]) pd.merge(left, right, how="left", on=["key1", "key2"]) pd.merge(left, right, how="outer", on=["key1", "key2"]) ###这里merge参数解释: #left: 需要合并的一个表,合并后在左侧 #right:需要合并的一个表,合并后在右侧 #how: 合并方式 #on: 在哪些索引上进行合并
交叉表
data = pd.crosstab(stock["week"], stock["pona"]) data.div(data.sum(axis=1), axis=0).plot(kind="bar", stacked=True)
透视表
相对于交叉表操作简单些
# 透视表操作 stock.pivot_table(["pona"], index=["week"])
col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]}) # 进行分组,对颜色分组,price1进行聚合 # 用dataframe的方法进行分组 col.groupby(by="color") # 或者用Series的方法进行分组聚合 col["price1"].groupby(col["color"])
要求
处理数据?
数据结构展示
数据网址
代码
# 1、准备数据 movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv") ###movie读入后如上图所示 ######################问题一 # 问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取? # 评分的平均分 movie["Rating"].mean() # 导演的人数 np.unique(movie["Director"]).size ######################问题二 ##绘制直方图查看分布 movie["Rating"].plot(kind="hist", figsize=(20, 8)) #利用matplotlib可更细致绘图 import matplotlib.pyplot as plt # 1、创建画布 plt.figure(figsize=(20, 8), dpi=80) # 2、绘制直方图 plt.hist(movie["Rating"], 20) # 修改刻度 plt.xticks(np.linspace(movie["Rating"].min(),movie["Rating"].max(), 21)) # 添加网格 plt.grid(linestyle="--", alpha=0.5) # 3、显示图像 plt.show() ######################问题三 ##如果我们希望统计电影分类(genre)的情况,应该如何处理数据? ###可以发现图中genre一列数据中每个电影都有多种标签,因此要先分割 # 先统计电影类别都有哪些 movie_genre = [i.split(",") for i in movie["Genre"]] ###得到的movie_genre结构图见《下图一》 ###这一块主要是把movie_genre的二维列表变为以为列表,然后利用unique函数去重 movie_class = np.unique([j for i in movie_genre for j in i]) len(movie_class)####这就得到了电影的类型标签种类数 # 统计每个类别有几个电影 count = pd.DataFrame(np.zeros(shape=[1000, 20], dtype="int32"), columns=movie_class) count.head()###得到的count结构如《下图二》 # 计数填表 for i in range(1000): count.ix[i, movie_genre[i]] = 1###注意ix现在不太能用了 ############movie_genre[i]将返回字符索引列 #这就得到了下面第三张图片的数据处理效果,列表示电影类型种类,行表示不同电影,如《下图三》 #因此只需逐列求和即可得到每类标签电影的数量 ##最终实现数据可视化如《下图四》 count.sum(axis=0).sort_values(ascending=False).plot(kind="bar", figsize=(20, 9), fontsize=40, colormap="cool")
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章将带大家学习一下如何在PPT中插入表格与图片以及在表格中插入内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
python的新式类是2 2版本引进来的,我们可以将之前的类叫做经典类或者旧式类。为什么要在2 2中引进new style class呢?官方给的解释是:
这篇文章主要为大家介绍了Python开启尾递归优化的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
Matplotlib是一个强大的Python绘图和数据可视化的工具包,下面这篇文章主要给大家介绍了关于Python高级数据分析之pandas和matplotlib绘图的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
大家好,本篇文章主要讲的是python报错TypeError: Input z must be 2D, not 3D的解决方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008