1.处理缺失值
Pandas使用NaN(Not a Number)来表示缺失值
1.1判断是否存在缺失值以及缺失值的个数
判断:data.isnull()
或pd.isnull(data)
,若只判断某一列时,data.isnull(data['column'])
或pd.isnull(data["column"])
,推荐第二种;
求缺失值的个数:这块一直不懂,贴上代码,望以后能想明白吧(衰)
age = data["Age"]
age_is_null = pd.isnull(data['Age'])
age_null_true = age[age_is_null]
age_null_count = len(age_null_true)
print(age_null_count)
1.2 过滤缺失值
data.dropna()
-------- dropna 在默认情况下会删除包含缺失值的行;
当然,在你传入参数axis = 1
时,可以删除包含缺失值的列;
当传入参数how = "all"
时,dropna是删除所有值为NA的行;
1.3 补全过滤值
你有时候可能需要以多种方式来补全缺失值,而并非是过滤掉缺失值,那在大多数情况下,主要使用 fillna 方法来补全缺失值。调用 fillna 时,可以用一个常数来代替缺失值,例如:
data.fillna(1)
/ data.fillna(0)
----------使用常数1或0 来替代;
当然你也可以为不同的列设定不同的值,这是可以传入一个字典,例如:
data.fillna({"column1":1,"column2":0})
--------- 对column1列使用1来替代缺失值,而cloumn2列使用0来替代;
fillna 更厉害的地方在于可以用于插值,通过传入参数 method = "ffill" 或 method = "bfill" ,分别是向前插值和向后插值,默认是 'ffill'; 不仅如此,你也可以用Series的平均值或中位数来填充缺失值,例如:
data.fillna(data["Age"].mean())
总结:
检查过滤值 | 过滤缺失值 | 补全缺失值 |
---|---|---|
pd.isnull(data) |
data.dropna() |
data.fillna() |
2.数据透视表------pivot_table
最简单的透视表必须有一个数据帧和一个索引。在本例中,我们将使用“Pclass”列作为我们的索引
pd.pivot_table(data,index = 'Pclass')
此外,你也可以设置多个索引,例如:
pd.pivot_table(data,index = ["Pclass","Sex"])
如果我只想显示‘Age’和‘Fare’列,其他列于我而言是没用的,这时可以使用values来显示我们只关心的列
pd.pivot_table(data,index = ["Pclass","Sex"],values = ['Age','Fare'])
上面列表中的数值代表了相应索引下的平均值(默认的),当然,我们自已也可以设置其他的聚合值,例如,求和或计数,这时需要使用聚合参数 aggfunc,同时需要导入numpy
pd.pivot_table(data,index = ['Pclass','Sex'],values = ['Age','Fare'],aggfunc = np.sum)
进行到这一步,我发现我只想对'Fare'列进行求和,而'Age'列,我想要求平均值,那该怎么办呢?
这时你需要向aggfunc传递一个字典,告诉pandas哪一列求平均,哪一列是求和
pd.pivot_table(data,index = ['Pclass','Sex'],values = ['Age','Fare'],aggfunc = {'Age':np.mean,'Fare':np.sum})
不过,如果我想查看一些总和数据呢?“margins=True”就可以为我们实现这种功能
pd.pivot_table(data,index = ['Pclass','Sex'],values = ['Age','Fare'],aggfunc = {'Age':np.mean,'Fare':np.sum},margins=True)
3. apply的用法
用途:
当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并将元组或者字典中的参数按照顺序传递给参数.
apply的中文意思是应用,那在python中作为函数我想也是作为同样的意思,其函数语法为apply(function,args),其中funcion为定义的函数,args为需向function中传入的一系列参数
apply的返回值就是function的返回值。
python中的DataFrame作为一个元组,其行或列就作为函数的参数。
下面举例说明
import numpy as np
import pandas as pd
data = pd.DataFrame(np.random.randn(4,4),columns = list('abcd'),index = ['ind1','ind2','ind3','ind4'])
data
结果为:
a b c d
ind1 0.177938 -0.877354 1.158941 -0.825953
ind2 -0.506917 -0.060584 -0.445731 -0.860620
ind3 -0.985207 0.708244 0.151892 0.721318
ind4 -1.214316 -0.844392 -1.283502 -1.329589
t1 = data.apply(lambda x:x.max()-x.min())
t1
a 1.392254
b 1.585598
c 2.442443
d 2.050907
dtype: float64
或使用参数axis = 1
,对行进行操作
t2 = data.apply(lambda x:x.max()-x.min(),axis = 1)
t2
ind1 2.036294
ind2 0.800036
ind3 1.706525
ind4 0.485197
dtype: float64
若想要作用于数据中的每一个元素,则需要使用函数 applymap
将DataFrame中的每个元素保留两位有效数字
f = lambda x: '%.2f' % x
data.applymap(f)
a b c d
ind1 0.18 -0.88 1.16 -0.83
ind2 -0.51 -0.06 -0.45 -0.86
ind3 -0.99 0.71 0.15 0.72
ind4 -1.21 -0.84 -1.28 -1.33
这里之所以使用applymap是因为,Series有一个元素级函数的map方法。而dataframe只有applymap.
t3 = data['a'].map(lambda x:'%.1f' %x)
t3
ind1 0.2
ind2 -0.5
ind3 -1.0
ind4 -1.2
Name: a, dtype: object
网友评论