- 首先来介绍什么是pandas
- pandas是基于numpy的一种工具,是为了解决数据分析任务而创建的,它纳入了大量库和一些标准的数据模型。提供了许多高效的操作和方法
- 其最初作为金融分析工具而开发出来,因此对时间序列分析有很好的支持(虽然我并没有学那么多。。。)
-
数据结构(来自百度百科) Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。 Time- Series:以时间为索引的Series。 DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。 Panel :三维的数组,可以理解为DataFrame的容器
- 直接记录自己的学习成果吧
- 初始化与显示
-
import pandas #pandas 是一个 数据预处理的库,实现功能要强于numpy #<class 'pandas.core.frame.DataFrame'>这事pandas的核心结构 food_info = pandas.read_csv("food_info.csv") print(type(food_info)) #pandas将str的数据当作object结构 print(food_info.dtypes) #print(help(pandas.read_csv)) #将刚才读的数据 显示出来,但是不会都显示 只会显示前五条(默认),可以指定参数 food_info_head = food_info.head() #food_info_head = food_info_head(3) #显示前三行 print(food_info_head) #显示后五行 food_info_tail = food_info.tail() print(food_info_tail) #显示所有列信息 columns = food_info.columns print(columns) #显示矩阵维度 print(food_info.shape)
-
- 基本的取值与计算操作
-
import pandas food_info = pandas.read_csv("food_info.csv") #取第一行数据 用到了loc函数 print(food_info.loc[0]) #Pandas中的数据类型 #object _For string values #int _ For Integer valuse #float _ For float values #datatime _ For time values #bool _ For Boolean valuse #可以使用切片来定位数据 print(food_info[3:6]) #可以取任意值通过想numpy那种索引的方式 two_five_ten = [2,5,10] print(food_info.loc[two_five_ten]) # #通过第一行的列名字拿到列 ndb_clo = food_info["NDB_No"] print(ndb_clo) # #取某几个列, columns = ["Zinc_(mg)","Copper_(mg)"] zinc_copper = food_info[columns] print(zinc_copper) #找到哪些列是以 g 为单位 哪些是以 mg为单位 col_names = food_info.columns.tolist() print(col_names) gram_columns = [] for c in col_names: if c.endswith("(g)"): gram_columns.append(c) #找到之后做成一个列表 当成索引 然后再原数据表中找 gram_df = food_info[gram_columns] print(gram_df.head(3)) #将mg转换为g 为单位的 (/1000)操作 ,会将此列所有元素 / 1000 print(food_info["Iron_(mg)"]) div_1000 = food_info["Iron_(mg)"] / 1000 print(div_1000) #两列的维度相同。此操作会将对应位置的数相乘 water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"] water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"] #将iron_(mg)/1000 后赋给一个 DataFrame 然后 创建一个新的列来接受这个dataframe iron_grams = food_info["Iron_(mg)"] / 1000 print(food_info.shape) food_info["Iron_(g)"] = iron_grams print(food_info.shape) #求某一列的最大值 max_calories = food_info["Energ_Kcal"].max() normalized_calories = food_info["Energ_Kcal"] / max_calories print(max_calories) print(normalized_calories)
-
- 设置索引
-
import pandas as pd fandango = pd.read_csv("fandango_score_comparison.csv") print(type(fandango)) fandango_films = fandango.set_index("FILM",drop=False) #将电影名当作索引,相当于又添加了一个索引,数值索引也可以用 print(fandango_films.index)
-
- 关于Serises
-
#series 是 dataFrame 的其中一行或其中一列 import pandas as pd from pandas import Series import numpy as np fandango = pd.read_csv("fandango_score_comparison.csv") series_film = fandango['FILM'] print(type(series_film)) print(series_film[0:5]) series_rt = fandango["RottenTomatoes"] print(series_rt[0:5]) #新建一个series结构 film_names = series_film.values #从dataFrame中拿出来的数据是series类型的,而从series中拿出来的数据与ndarray类似,pandas是封装在numpy基础之上的 print(type(film_names)) rt_score = series_rt.values #设置一个Series 设置键,值 series_custom = Series(rt_score,index = film_names) print(series_custom[['Minions (2015)','Leviathan (2014)']]) fiveten = series_custom[5:10] print(fiveten) sc2 = series_custom.sort_values() #按值排序 sc3 = series_custom.sort_index() #按键排序 print(sc2) print(sc3) #对series中的数据所做的数学操作 print(np.add(series_custom,series_custom)) print(np.sin(series_custom)) print(np.max(series_custom)) citys = Series(fandango["RottenTomatoes"].values , index=fandango["FILM"]) users = Series(fandango["RottenTomatoes_Users"].values,index=fandango["FILM"]) mean = (citys + users) / 2
-
- 排序
-
import pandas food_info = pandas.read_csv("food_info.csv") #默认从小到大排序 food_info.sort_values("Sodium_(mg)",inplace=True) print(food_info["Sodium_(mg)"]) #从大到小排序,升序指定为false #缺失值放到最后 food_info.sort_values("Sodium_(mg)",inplace=True,ascending=False) print(food_info["Sodium_(mg)"])
-
- 自定义函数
-
import pandas as pd titanic_survival = pd.read_csv("titanic_train.csv") #遇到pandas函数无法处理时,自定义函数 #返回第100条数据 def hundredth_row(column): hundredth_item = column.loc[99] return hundredth_item #调用apply方法找到第100条数据 hundredth_row = titanic_survival.apply(hundredth_row) print(hundredth_row) #计算每一个列(每一条属性)其缺失值是多少 def not_null_count(column): #对传入的整个数据集的每一条column逐条计算null的坐标 column_null = pd.isnull(column) #print(column_null) #根据坐标找到那些为null的值,生成一个列表,然后返回列表的长度 null = column[column_null] return len(null) column_null_count = titanic_survival.apply(not_null_count) print(column_null_count) def which_class(row): #对传入的每一行做操作 pclass = row['Pclass'] if pd.isnull(pclass): return "Unknown" elif pclass == 1: return "FirstClass" elif pclass == 2: return "SecondClass" elif pclass == 3: return "ThirdClass" #轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。 classes = titanic_survival.apply(which_class,axis=1) print(classes) #将连续值离散化,大于18随返回False 小于18返回True,未知返回unknown def is_minor(row): age = row["Age"] if age < 18: return "minor" elif pd.isnull(age): return "Unknown" else: return "adult" age_labels = titanic_survival.apply(is_minor,axis=1) print(age_labels) #计算获救人数与年龄的关系,计算成年人获救的平均值和非成年人获救的平均值 titanic_survival["age_labels"] = age_labels age_group_survival = titanic_survival.pivot_table(index = "age_labels" , values="Survived") print(age_group_survival)
-
- 实践
-
import numpy as np import pandas as pd titanic_survival = pd.read_csv("titanic_train.csv") #print(titanic_survival.head()) age = titanic_survival["Age"] #print(age[0:10]) age_is_null = pd.isnull(age) #print(age_is_null) #将他作为索引,找出age中为空的值 age_null_ture = age[age_is_null] #print(age_null_ture) age_null_count = len(age_null_ture) print(age_null_count) #因为其中有空值,所以求平均也会有空值,所以应该将缺失值去掉 #avg_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"]) #print(avg_age) #过滤出年龄为空的所有的值(过滤出age_is_null中所有为true的值,留下那些false值) # good_ages = titanic_survival["Age"][age_is_null == False] # print(good_ages) # correct_avg_age = sum(good_ages) / len(good_ages) #可以直接调用pandas中自带的函数来求均值 correct_avg_age = titanic_survival["Age"].mean() print(correct_avg_age) #三个不同的仓位等级 其票价的平均值为多少 passenger_classes = [1,2,3] fares_by_class = {} for this_class in passenger_classes: #找到三种不同的等级 pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class] pclass_fare = pclass_rows["Fare"] fare_for_class = pclass_fare.mean() fares_by_class[this_class] = fare_for_class print(fares_by_class) fare_class = titanic_survival.pivot_table(index = "Pclass" , values = "Fare" , aggfunc=np.mean) print(fare_class) survival_by_class = {} for this_class in passenger_classes: survival_rows = titanic_survival[titanic_survival["Pclass"] == this_class] survival_people = survival_rows["Survived"] survived_for_class = survival_people.mean() survival_by_class[this_class] = survived_for_class print(survival_by_class) #求各个仓位 获救人数的平均值,就不用循环了直接用pivot_table函数 #求 以Pclass为基准的。与Survived有关的平均值 passenger_survival = titanic_survival.pivot_table(index = "Pclass", values="Survived",aggfunc=np.mean) print(passenger_survival) #如果不指定aggfunc,则默认求均值 操作 passenger_age = titanic_survival.pivot_table(index = "Pclass" , values = "Age" ) print(passenger_age) #求一个值与其他两个值的关联,求登船口与费用 和 生还量 的总值 之间的关系 port_stats = titanic_survival.pivot_table(index = "Embarked" , values=["Fare","Survived"] ,aggfunc=np.sum) print(port_stats) #将缺失值删除.以列方式 drop_na_cloumns = titanic_survival.dropna(axis=1) #将 Age 和 Sex 中有na值的行 drop掉 new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age","Sex"]) #通过行号和列号定位具体值 第83行的 Age列 row_index_83_age = titanic_survival.loc[83,"Age"] row_index_1000_pclass = titanic_survival.loc[766,"Pclass"] print(row_index_83_age) print(row_index_1000_pclass) #排完序之后的index还是原来的index 不会变 new_titanic_survival = titanic_survival.sort_values("Age",ascending=False) print(new_titanic_survival) #将其index重新排列。drop = true 表示原来的 index 不要了 生成新的值 titanic_reindexed = new_titanic_survival.reset_index(drop=True) print("-------------------") print(titanic_reindexed.loc[0:10])
-
- 初始化与显示
- 声明:这些代码中用到的文件吧,都是唐宇迪老师机器学习课程里面的csv文件。本人还是在校大学生一枚,辣鸡的很,假如(真的是加入)这篇文章有人看到的话,如有错误或侵权请私信给我 我即刻改正或删除,初入博客有做的不正确之处,请各位指正。
转载于:https://my.oschina.net/u/3900854/blog/1934879