Pandas 与 Numpy 常用方法总结

Lambda 函数实现

简单的说,lambda 就是一个函数,但是这个函数没有名字,所以我们介绍一下这个函数的调用形式,参数与返回值的实现。 lambda 的格式如下:

lambda [arg1 [, agr2,.....argn]] : expression
lambda x : expression

那么这个函数怎么使用了,它常常不是单独使用,单独的使用的时候可以较为简单,实现的功能过于简单。所以通常被使用的情况是,某个函数的参数是一个函数,那么这个参数就可以使用 lambda来实现。

>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>> list(map(lambda x: x * 2 + 10, foo)) 
# 这里的 map 函数的第一个参数就是函数

Pandas的Apply函数

apply 函数如下 DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds) 。其核心部分是function 的选择,其次是 axis 表示维度,这个函数可以通过上面说的 lambda函数实现。这个函数的参数就是 DataFrame, 返回的对象既可以是 DataFrame 也可以是 series。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
>>> df.apply(np.sqrt)
     A    B
0  2.0  3.0
1  2.0  3.0
2  2.0  3.0
# 返回的是一个 DataFrame

>>> df.apply(np.sum, axis=0)
A    12
B    27
dtype: int64 # 返回的是一个 Series
>>> df.apply(lambda x: x*2 + 1, axis = 1) # 这种情况下,x 表示的是 df 中所有的参数
   A   B
0  9  19
1  9  19
2  9  19
>>> df.apply(lambda x: [1, 2,5], axis=1)
0    [1, 2, 5]
1    [1, 2, 5]
2    [1, 2, 5]
>>> df.apply(lambda x: [1, 2,5], axis=0)
   A  B
0  1  1
1  2  2
2  5  5
>>> df.apply(lambda x: [1, 2,6,7,8,5], axis=0)
A    [1, 2, 6, 7, 8, 5]
B    [1, 2, 6, 7, 8, 5]
>>> type(df.apply(lambda x: [1, 2,6,7,8,5], axis=0))
<class 'pandas.core.series.Series'>
# 这时,将DataFrame变成一个 Series。

python Zip函数

zip 函数的使用就是 zip([iterable, …]) 。zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。

>>> name = [ "Manjeet", "Nikhil", "Shambhavi", "Astha" ]
>>> roll_no = [ 4, 1, 3, 2 ]
>>> marks = [ 40, 50, 60, 70 ]
>>> mapped = zip(name, roll_no, marks)
>>> list(mapped)
[('Manjeet', 4, 40), ('Nikhil', 1, 50), ('Shambhavi', 3, 60), ('Astha', 2, 70)]

Pandas 中的 Map函数

Map 函数主要是对 DataFrame 的操作,其参数还可以是函数,

>>> import pandas as pd
>>> from pandas import Series, DataFrame
>>> data = DataFrame({'food':['bacon','pulled pork','bacon','Pastrami',
   'corned beef','Bacon','pastrami','honey ham','nova lox'],
     'ounces':[4,3,12,6,7.5,8,3,5,6]})
>>> data
          food  ounces
0        bacon     4.0
1  pulled pork     3.0
2        bacon    12.0
3     Pastrami     6.0
4  corned beef     7.5
5        Bacon     8.0
6     pastrami     3.0
7    honey ham     5.0
8     nova lox     6.0
>>> meat_to_animal = {
 'bacon':'pig',
 'pulled pork':'pig',
 'pastrami':'cow',
 'corned beef':'cow',
 'honey ham':'pig',
 'nova lox':'salmon' } 

>>> meat_to_animal
{'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow', 'corned beef': 'cow', 'honey ham': 'pig', 'nova lox': 'salmon'}
>>> data['food'].map(str.lower)
0          bacon
1    pulled pork
2          bacon
3       pastrami
4    corned beef
5          bacon
6       pastrami
7      honey ham
8       nova lox
Name: food, dtype: object
>>> data['animal'] = data['food'].map(str.lower).map(meat_to_animal)
>>> data
          food  ounces  animal
0        bacon     4.0     pig
1  pulled pork     3.0     pig
2        bacon    12.0     pig
3     Pastrami     6.0     cow
4  corned beef     7.5     cow
5        Bacon     8.0     pig
6     pastrami     3.0     cow
7    honey ham     5.0     pig
8     nova lox     6.0  salmon
>>> data['ounces'] = data['ounces'].map(lambda x: x+ 2) # 这里使用 Map 函数与Apply函数有点类似
>>> data
          food  ounces  animal
0        bacon     6.0     pig
1  pulled pork     5.0     pig
2        bacon    14.0     pig
3     Pastrami     8.0     cow
4  corned beef     9.5     cow
5        Bacon    10.0     pig
6     pastrami     5.0     cow
7    honey ham     7.0     pig
8     nova lox     8.0  salmon

Numpy 中stack(),hstack(),vstack()函数

stack() 函数

函数原型为:stack(arrays, axis=0),arrays可以传数组和列表。axis的含义我下面会讲解,我们先来看个例子。

>>> import numpy as np
>>> a=[[[1,2,3,4],[11,21,31,41]],
   [[5,6,7,8],[51,61,71,81]],
   [[9,10,11,12],[91,101,111,121]]]
>>> a
[[[1, 2, 3, 4], [11, 21, 31, 41]], [[5, 6, 7, 8], [51, 61, 71, 81]], [[9, 10, 11, 12], [91, 101, 111, 121]]]
# 可以看成 a 有三层,我们把从外到里分别看成 axis = 0, axis = 1, axis = 2的三层,首先要确定这个 list a,有三个元素,每个元素都# 是一个 list_1,每个 lsit_1 有两个 list_2 元素, 
>>> np.stack(a, axis = 0)
array([[[  1,   2,   3,   4],
        [ 11,  21,  31,  41]],

       [[  5,   6,   7,   8],
        [ 51,  61,  71,  81]],

       [[  9,  10,  11,  12],
        [ 91, 101, 111, 121]]])
>>> d = np.stack(a, axis = 0)
>>> len(d)
3
>>> d.shape			# 在shape中分别表示从外到里的维度
(3, 2, 4)
# 得到的是一个 array 的类型,堆叠的是 axis = 0的那一层,相当于没变,只是数据格式改变
>>> np.stack(a, axis = 1)
array([[[  1,   2,   3,   4],
        [  5,   6,   7,   8],
        [  9,  10,  11,  12]],

       [[ 11,  21,  31,  41],
        [ 51,  61,  71,  81],
        [ 91, 101, 111, 121]]])
>>> c = np.stack(a, axis = 1)
>>> c.shape
(2, 3, 4)
# 这里获取 array 的每个元素的方式
>>> np.stack(a, axis = 2)
array([[[  1,   5,   9],
        [  2,   6,  10],
        [  3,   7,  11],
        [  4,   8,  12]],

       [[ 11,  51,  91],
        [ 21,  61, 101],
        [ 31,  71, 111],
        [ 41,  81, 121]]])
>>> b = np.stack(a, axis = 2)
>>> b.shape
(2, 4, 3)

我们可以这样理解,stack 过程中堆叠了那一层的元素,将这些元素作为新的 Array 的最里层,axis != 0 的时候永远都是将第一层的元素堆叠成新的最里层元素。

hstack() 函数

对于上面的例子,我们做个转换就很好理解 hstack() 函数了

>>> d = np.stack(a, axis = -1)
>>> d
array([[[  1,   5,   9],
        [  2,   6,  10],
        [  3,   7,  11],
        [  4,   8,  12]],

       [[ 11,  51,  91],
        [ 21,  61, 101],
        [ 31,  71, 111],
        [ 41,  81, 121]]])
>>> d = np.hstack(d)
>>> d
array([[  1,   5,   9,  11,  51,  91],
       [  2,   6,  10,  21,  61, 101],
       [  3,   7,  11,  31,  71, 111],
       [  4,   8,  12,  41,  81, 121]])
>>> d = np.hstack(d)
>>> d
array([  1,   5,   9,  11,  51,  91,   2,   6,  10,  21,  61, 101,   3,
         7,  11,  31,  71, 111,   4,   8,  12,  41,  81, 121])
>>> a = [[[[1, 2, 3, 4], [11, 21, 31, 41]], [[5, 6, 7, 8], [51, 61, 71, 81]], [[9, 10, 11, 12], [91, 101, 111, 121]]]]
>>> a
[[[[1, 2, 3, 4], [11, 21, 31, 41]], [[5, 6, 7, 8], [51, 61, 71, 81]], [[9, 10, 11, 12], [91, 101, 111, 121]]]]
 hstack() 还可以用于两个array 的横向合并
>>> a=[[1],[2],[3]]
>>> b=[[1],[2],[3]]
>>> np.hstack((a,b))
array([[1, 1],
       [2, 2],
       [3, 3]])
 vstack() 函数用于列的合并,也就是纵向
>>> np.vstack((a,b))
array([[1],
       [2],
       [3],
       [1],
       [2],
       [3]])

Pandas分组运算(groupby)函数

groupby 函数就如字面上的意思,就是分组的意思,常用的方法第一个是分组, mean() 方法, 而groupby 的方法也常常用在观察数据类型中,在实际中分组也会使用

import pandas as pd
>>> df = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'], 'B': [2, 8, 1, 4, 3, 2, 5, 9],'C': [102, 98, 107, 104, 115, 87, 92, 123]})
>>> df
   A  B    C
0  a  2  102
1  b  8   98
2  a  1  107
3  c  4  104
4  a  3  115
5  c  2   87
6  b  5   92
7  c  9  123
>>> df.groupby('A').mean()
     B           C
A                 
a  2.0  108.000000
b  6.5   95.000000
c  5.0  104.666667
>>> df.groupby(['A','B']).mean()
       C
A B     
a 1  107
  2  102
  3  115
b 5   92
  8   98
c 2   87
  4  104
  9  123

聚合方法size()和count()

size跟count的区别: size计数时包含 NaN 值,而count不包含 NaN 值, 我们可以理解 groupby函数是用来分组,那么分组之后的函数是可以选择的,可以是 mean() ,查看,或者是 count() 计数,下面这个例子:

>>> df = pd.DataFrame({"Name":["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"],"City":["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"],"Val":[4,3,3,np.nan,np.nan,4]})
>>> df
       City     Name  Val
0   Seattle    Alice  4.0
1   Seattle      Bob  3.0
2  Portland  Mallory  3.0
3   Seattle  Mallory  NaN
4   Seattle      Bob  NaN
5  Portland  Mallory  4.0
>>> df.groupby(["Name", "City"], as_index=False)['Val'].count()
      Name      City  Val
0    Alice   Seattle    1
1      Bob   Seattle    1
2  Mallory  Portland    2
3  Mallory   Seattle    0
>>> df.groupby(["Name"], as_index=False)['City'].count()
      Name  City
0    Alice     1
1      Bob     2
2  Mallory     3
# 选择的那一组表示次数, 比如上面的 City,而Size 函数就是包含 NaN 的个数
posted @ 2019-06-08 21:33  虾野百鹤  阅读(1019)  评论(2编辑  收藏  举报