pandas–数据分析处理库
DataFrame
DataFrame 是一种二维的数据结构,非常接近于电子表格或者类似 mysql 数据库的形式。它的竖行称之为 columns,横行跟前面的 Series 一样,称之为 index,也就是说可以通过 columns 和 index 来确定一个主句的位置。
-
–将单位为mg转换为g(除以1000)
print(food_info[“Iron_(mg)”])
div_1000 = food_info[“Iron_(mg)”] / 1000
print(div_1000)–向列中的每个值添加100,并返回一个Series对象
add_100 = food_info[“Iron_(mg)”] + 100
print(add_100)–从列中的每个值减去100并返回一个Series对象
sub_100 = food_info[“Iron_(mg)”] - 100
print(sub_100)–将列中的每个值乘以2并返回一个Series对象
mult_2 = food_info[“Iron_(mg)”]*2
print(mult_2) -
#Score=2×(Protein_(g))−0.75×(Lipid_Tot_(g))
weighted_protein = food_info[“Protein_(g)”] * 2
weighted_fat = -0.75 * food_info[“Lipid_Tot_(g)”]
initial_rating = weighted_protein + weighted_fat
print(initial_rating) -
#“Vit_A_IU”列从0到100000,而“Fiber_TD_(g)”列从0到79,对于某些计算,像“Vit_A_IU”这样的列可以对结果产生更大的影响。
max_calories = food_info[“Energ_Kcal”].max() #“Energ_Kcal”列中的最大值。
print(max_calories)
#用“Energ_Kcal”中的值除以最大的值。
normalized_calories = food_info[“Energ_Kcal”] / max_calories
normalized_protein = food_info[“Protein_(g)”] / food_info[“Protein_(g)”].max()
normalized_fat = food_info[“Lipid_Tot_(g)”] / food_info[“Lipid_Tot_(g)”].max()
food_info[“Normalized_Protein”] = normalized_protein
print(food_info[“Normalized_Protein”])
food_info[“Normalized_Fat”] = normalized_fat
print(food_info[“Normalized_Fat”])
- 默认情况下,panda将按我们指定的列按升序排序数据,并返回一个新的DataFrame,对DataFrame进行就地排序,而不
是返回一个新的DataFrame。是返回一个新的DataFrame。
food_info.sort_values(“Sodium_(mg)”, inplace=True)
print(food_info[“Sodium_(mg)”]) #打印food_info [" Sodium_ (mg)”)
#ascending升序,越来越大;descending降序,越来越小,pandas默认升序。
food_info.sort_values(“Sodium_(mg)”, inplace=True, ascending=False) #按降序排序,而不是按升序排序。
print(food_info[“Sodium_(mg)”])
-
读csv文件,读取前五行数据
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv(“titanic_train.csv”)
titanic_survival.head() #head无参数,默认前五行 -
panda库使用NaN(代表“非数字”)表示缺失值。我们可以使用pandas.isnull()函数,来判断是否为空。如果为空,则返回true,否则为false。
age = titanic_survival[“Age”]
print(age.loc[0:10]) ##显示age数据的0——10行
age_is_null = pd.isnull(age)
print(age_is_null) #判断空值输出true,不为空输出false
age_null_true = age[age_is_null] #将age_is_null的值为true的留下来,把age_is_null值为false的过滤掉
print(age_null_true) #打印所有的缺失值
age_null_count = len(age_null_true)
print(age_null_count) #打印缺失值个数
-
丢失数据是如此常见,以至于许多panda方法会自动对其进行过滤
correct_mean_age = titanic_survival[“Age”].mean() #直接用Pandas中自带的mean()函数求平均
print(correct_mean_age)
注意:其实直接滤去缺失值的样本并不是一个很好的方法,其实我们可以拿年龄的平均数、中位数、重数进行一个填充。 -
求每类船舱对应的平均票价(用for循环的方式求出平均) (该方法较为麻烦)
要求:船舱等级一共有[1,2,3]三种,分别对应不同的票价,所以每一级船舱都有自己的平均票价。求每级船舱的平均票价。
过程:通过for循环对每一类船舱进去抽取,抽取出属于同一类船舱等级的船客的全部信息,再从每一个分类船客中抽出“Fare”(船票价格)这列数据,对其用,mean()函数求平均,再返回给每一类的类别。
passenger_classes = [1, 2, 3] #船舱等级用list列出[1,2,3]
fares_by_class = {} #定义空的字典,用来存放船舱等级以及对应的平均票价
for this_class in passenger_classes: #对每一类船舱进行循环
pclass_rows = titanic_survival[titanic_survival[“Pclass”] == this_class] #当this_class = 1时,返回的是所有一等舱的船客的信息
pclass_fares = pclass_rows[“Fare”] #再从每次取得的信息中,返回“Fare”(票价)这列的数据
fare_for_class = pclass_fares.mean() #用.mean()对票价求平均
fares_by_class[this_class] = fare_for_class #将对应的平均票价传给对应的船舱
print(fares_by_class)
—{1: 84.15468749999992, 2: 20.66218315217391, 3: 13.675550101832997}
- 用pandas自带的函数.pivot_table()来统计船舱等级与平均票价的关系
.pivot_table() : 相当于一个数据透视表,也相当于统计一个量与其他量之间关系的一个函数
.pivot_table()有三个参数:
index:表示接下来要统计的信息是以谁为基准的,index就 = 谁
values:表示用统计index与谁之间的关系,values就 = 谁
aggfunc:表示index与values之间的什么关系,aggfunc就 = 什么关系(不写的话,默认求均值)
passenger_survival = titanic_survival.pivot_table(index=“Pclass”, values=“Survived”, aggfunc=np.mean) #每个船舱等级对应的平均票价,所以index = Pclass船舱等级;Pclass与票价之间的关系,values = Fare;求的是船舱等级与票价的平均值之间的关系,所以aggfunc=np.mean()
print(passenger_survival)
—Pclass
1 0.629630
2 0.472826
3 0.242363
Name: Survived, dtype: float64
- .用.pivot_table()求每类船舱对应的平均年龄
passenger_age = titanic_survival.pivot_table(index=“Pclass”, values=“Age”)
passenger_age = titanic_survival.pivot_table(index=“Pclass”, values=“Age”)
print(passenger_age)
—Pclass
1 38.233441
2 29.877630
3 25.140620
Name: Age, dtype: float64
- 用.pivot_table()看一个量与其他两个量之间的关系
需求:想要看不同的登船地点(C,Q,S)的总的票价和总的获救人数。
过程:用.pivot_table()的话,对于index ,接下来要统计的东西是以登船地点为基准的,所以index = “Embarked”
对于values,要统计的是不同登船地点与票价和是否获救之间的关系,所以values = [“Fare”,“Survived” ]
对于aggfunc,要统计的是不同登船地点的总的票价和总的获救人数,所以aggfunc = np.sum
port_stats = titanic_survival.pivot_table(index=“Embarked”, values=[“Fare”,“Survived”], aggfunc=np.sum)
port_stats = titanic_survival.pivot_table(index=“Embarked”, values=[“Fare”,“Survived”], aggfunc=np.sum)
print(port_stats)
— Fare Survived
Embarked
C 10072.2962 93
Q 1022.2543 30
S 17439.3988 217
-
用.dropna()扔掉具有缺失值的行
drop_na_columns = titanic_survival.dropna(axis=1) #指定axis=1或axis='columns’将删除任何具有null值的列
new_titanic_survival = titanic_survival.dropna(axis=0,subset=[“Age”, “Sex”]) #看一些Age和Sex这两列有没有缺失值的,如果有,就把具有缺失值的这行数据扔掉。
print(new_titanic_survival) -
用.loc()确定到每一个坐标上的数据(数据中每一个具体的值都是由一个行号和列名唯一确定的,所以完全可以用行号和列名来返回这个位置上的值.)
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)
—28.0
1 -
用.sort_values()进行数据的重新排序,并用.reset_index()重置排序后的index值(即行号)
用.sort_values()对数据进行排序后,虽然行的顺序因为排序条件发生了变化,但是其行号却还保持着之前的样子,为了让排序后的数据的行号变成从0开始,依次增大,所以运用.reset_index()进行重置
new_titanic_survival = titanic_survival.sort_values(“Age”,ascending=False) #根据“Age”的大小逆序排列。
print(new_titanic_survival[0:10]) #打印未进行.reset_index时的数据前10行
titanic_reindexed = new_titanic_survival.reset_index(drop=True)
print(titanic_reindexed.iloc[0:10])
-
apply(自定义函数名) 的功能,可以通过写apply()函数,而这个apply()函数就相当于我们可以进行一个自定义函数的操作。
在apply()中传进来的是一个函数名,而传进来的函数可以是自己定义的函数,即将自己的操作定义成一个函数的形式,然后apply一下,这时就会在这个DataFrame中执行这个操作了。我们想要返回数据集合的第100行数据。过程:先定义一个返回第100行数据的函数hundredth_row ,然后在apply一下
def hundredth_row(column): #定义一个新的函数hundredth_row,用来返回第100行数据
hundredth_item = column.iloc[99]
return hundredth_item
hundredth_row = titanic_survival.apply(hundredth_row) #将新定义好的函数apply一下
print(hundredth_row)
—PassengerId 100
Survived 0
Pclass 2
Name Kantor, Mr. Sinai
Sex male
Age 34
SibSp 1
Parch 0
Ticket 244367
Fare 26
Cabin NaN
Embarked S
dtype: object
- 用apply(自定义函数名)来得到每一个属性缺失值的个数。
def not_null_count(column): #返回所有属性缺失值的个数
column_null = pd.isnull(column) #返回值是true或flase
null = column[column_null] #缺失值列表
return len(null)
column_null_count = titanic_survival.apply(not_null_count)
print(column_null_count)
—PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
-
用apply(自定义函数名)来对船舱等级【1,2,3】进行一个改写,改成First Class,Second Class ,Third Class
def which_class(row):
pclass = row[‘Pclass’]
if pd.isnull(pclass):
return “Unknown”
elif pclass == 1:
return “First Class”
elif pclass == 2:
return “Second Class”
elif pclass == 3:
return “Third Class”
classes = titanic_survival.apply(which_class, axis=1) #通过传入axis=1参数,我们可以使用DataFrame.apply()方法来遍历行,而不是列。
print(classes)
—0 Third Class
1 First Class
2 Third Class
3 First Class
4 Third Class
5 Third Class
6 First Class
7 Third Class
8 Third Class
… -
将年龄离散化,在本实例数据集上的“Age”是一个连续的值,这里以18为界限,将其离散化。
def is_minor(row):
if row[“Age”] < 18:
return True
else:
return False
minors = titanic_survival.apply(is_minor, axis=1)
print(minors)
def generate_age_label(row):
age = row[“Age”]
if pd.isnull(age):
return “unknown”
elif age < 18:
return “minor”
else:
return “adult”
age_labels = titanic_survival.apply(generate_age_label, axis=1)
print(age_labels)
- 利用上边的自定义函数,使用.pivot_table()函数得到年龄阶段与获救率之间的关系。
titanic_survival[‘age_labels’] = age_labels #将上一个里边返回的关于age_labels的数据组合成数据的一列,得到年龄阶段与存活率之间的关系
age_group_survival = titanic_survival.pivot_table(index=“age_labels”, values=“Survived”)
print(age_group_survival)
—age_labels
adult 0.381032
minor 0.539823
unknown 0.293785
Name: Survived, dtype: float64