前言
接上次Pandas常用函数,一方面为了记录,另一方面方便以后查阅复习。Pandas应该会写好几个系列。
正文
【1】DataFrame的加减乘除:
可以直接:
df1 + df2; df1 - df2; df1 * df2; df1 / df2;
但我觉得用df1.add(df2)更好,因为可以通过fill_value参数将nan值设置为特定值。
例如:
a = DataFrame(np.array([[np.nan, 2, 3],[4, 5, 6]]))
b = DataFrame(np.array([[1, 2, 3],[0, 5, 6]]))
print("a+b = \n{}".format(a+b))
print("\na+b = \n{}".format(a.add(b,fill_value=0)))
结果:
a+b =
0 1 2
0 NaN 4.0 6.0
1 4.0 10.0 12.0
a+b =
0 1 2
0 1.0 4.0 6.0
1 4.0 10.0 12.0
四种运算:
方法 | 说明 |
---|---|
add | + |
sub | - |
mul | * |
div | / |
【2】函数应用到每一个元素apply
形式:obj.apply(f)
obj既可以是DataFrame也可以是Series,f是定义的函数(可用def或lambda定义),具体参考代码:
def f1(x):
return(x**2+x-1)
f2 = lambda x:x**2+x+1
a = Series(np.arange(10))
a.apply(f1)
a.apply(f2)
#结果
0 -1
1 1
2 5
3 11
4 19
5 29
6 41
7 55
8 71
9 89
dtype: int64
0 1
1 3
2 7
3 13
4 21
5 31
6 43
7 57
8 73
9 91
dtype: int64
不过像常用的函数DataFrame都已经封装好了,一般不用自己再去定义了。
【3】排序sort_index
形式:obj.sort_index()
(1)按索引排序:
可以按照列或者行索引来排序,见代码:
a = DataFrame(np.arange(10).reshape(2, 5), index=['two', 'one'], columns=list('abdec'))
print(a)
#结果
a b d e c
two 0 1 2 3 4
one 5 6 7 8 9
print('按行索引排序:\n{}'.format(a.sort_index()))
print('按列索引排序:\n{}'.format(a.sort_index(axis=1)))
#结果
按行索引排序:
a b d e c
one 5 6 7 8 9
two 0 1 2 3 4
按列索引排序:
a b c d e
two 0 1 4 2 3
one 5 6 9 7 8
(2)按值排序:
这个我觉得是更常用到的,比如我们要按照某一列的值进行升序排序,这时需要用到sort_index里的by参数
a = DataFrame(np.random.randn(10).reshape(5, 2), index=list('abcde'), columns=['aa','bb'])
print(a)
#结果
aa bb
a 0.842502 -0.381258
b -1.025136 -0.278948
c -0.976224 0.067868
d 0.715478 0.005176
e 0.481956 -0.230099
print(a.sort_index(by='bb'))
#结果
aa bb
a 0.842502 -0.381258
b -1.025136 -0.278948
e 0.481956 -0.230099
d 0.715478 0.005176
c -0.976224 0.067868
P.s:通过设置axis=1可以按行排序,如果想要降序排序,则只要把ascending=False即可。
【3】相关系数和协方差
观察特征间的相关性等信息时会用到
形式:
Series1.corr(Series2) #相关系数
Series1.cov(Series2) #协方差
(注意!计算的是两个Series间重叠的、非nan的、有相同索引值的相关系数和协方差。)
Df.corr()
Df.cov()
【4】给Series中的值计数 value_couts()
这个实在是太重要和常用了
形式:Series.value_counts()
注意它的对象只能是Series,如果是DataFrame会报错
#还以上面的a为例:
# a
aa bb
a 0.066364 0.531851
b -0.836768 0.649175
c 0.056774 -0.558052
d -0.970745 1.042477
e -0.214167 -0.014830
a['aa'].value_counts()
#结果
-0.970745 1
0.066364 1
-0.214167 1
-0.836768 1
0.056774 1
Name: aa, dtype: int64
【5】判断某(些)元素是否在Series或DataFrame里:isin()
注意,isin()括号里的参数必须为列表:
a.isin(‘0’) ---->错
a.isin([‘0’]) ---->对
代码:
a = DataFrame(np.arange(10).reshape(5, 2), index=list('abcde'), columns=['aa','bb'])
print(a)
#结果
aa bb
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
a.isin(['2'])
#结果
aa bb
a False False
b True False
c False False
d False False
e False False
对象既可以是DataFrame也可以是Series
【6】对DataFrame的所有数据进行汇总统计 describe()
可以用来看下数据的一些特征,以刚刚的a为例:
a.describe()
#结果
aa bb
count 5.000000 5.000000
mean 4.000000 5.000000
std 3.162278 3.162278
min 0.000000 1.000000
25% 2.000000 3.000000
50% 4.000000 5.000000
75% 6.000000 7.000000
max 8.000000 9.000000
【7】对于缺失值的处理
处理数据时缺失值是经常遇到的,在Pandas中,会把缺失值所在位置用NAN(Not A Number)代替,对于缺失值的处理有4种方法:
(1)直接删除:obj.dropna()
可以直接将NAN值删去(默认是删除所有存在NAN的行,也可以设置axis=1来删除所有存在NAN的列)
代码:
a = DataFrame(np.array([[1, 2, 3],[np.nan, 5, 6],[7, 8 ,np.nan]]))
print(a)
print(a.dropna())
print(a.dropna(axis=1))
#结果
0 1 2
0 1.0 2.0 3.0
1 NaN 5.0 6.0
2 7.0 8.0 NaN
0 1 2
0 1.0 2.0 3.0
1
0 2.0
1 5.0
2 8.0
通过设置参数how=‘all’将只删除全为NAN的行或列
代码:
a = DataFrame(np.array([[1, 2, 3],[np.nan, 5, 6],[np.nan, np.nan ,np.nan]]))
print(a)
print(a.dropna(how='all'))
print(a.dropna(how='all', axis=1))
#结果
0 1 2
0 1.0 2.0 3.0
1 NaN 5.0 6.0
2 NaN NaN NaN
0 1 2
0 1.0 2.0 3.0
1 NaN 5.0 6.0
0 1 2
0 1.0 2.0 3.0
1 NaN 5.0 6.0
2 NaN NaN NaN
(2)替换:fillna()
我们可以用obj.fillna()来替换NAN值,其中,有三个参数较为重要
- inpace参数:通过设置inplace=True,可以让所有的NAN值都为具体设定的值;
- value参数:让所有的NAN值都为具体设定的值;
3.method参数:类似于reindex中的method,让所有NAN值都为具体的数值,如mean
其中,inplace会改变原对象,而value不会
代码:
a = DataFrame(np.array([[1, 2, 3],[np.nan, 5, 6],[np.nan, np.nan ,np.nan]]))
print(a)
#结果
0 1 2
0 1.0 2.0 3.0
1 NaN 5.0 6.0
2 NaN NaN NaN
a.fillna(value=1)
print(a)
a.fillna(1, inplace=True)
print(a)
#结果
0 1 2
0 1.0 2.0 3.0
1 NaN 5.0 6.0
2 NaN NaN NaN
0 1 2
0 1.0 2.0 3.0
1 1.0 5.0 6.0
2 1.0 1.0 1.0
(3)isnull()和notnull()
会返回一个boll型的DataFrame对象,很好理解