码迷,mamicode.com
首页 > 其他好文 > 详细

【数据分析-numpy-pandas】

时间:2021-04-05 11:42:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cfa   对象   --   标准   cos   pytho   访问   适用于   总结   

数据分析-Numpy

1.numpy-安装和使用

1.1 简介

1.2 安装

pip install numpy

1.3 使用

import numpy as np

2.numpy-ndarray的数据类型

  • 简单示例
  • 下划线是为了和python关键字区分
a = np.array(range(10))
a.dtype # 数据类型
  • ndarray-数据类型
    • 布尔:
      • bool_
    • 整型:
      • int_
      • int8
      • int16
      • int32
      • int64
    • 无符号整型:正输
      • uint8
      • uint16
      • uint32
      • uint64
    • 浮点数
      • float_
      • float16
      • float32
      • float64
    • 复数
      • complex_
      • complex64
      • complex128

3.numpy-ndarray-方法

In [23]: import numpy as np
    ...: data = np.array([[2,3,4],[4,5,6]])
In [24]: data
Out[24]: 
array([[2, 3, 4],
       [4, 5, 6]])
  • 查看元素个数
In [26]: data.size
Out[26]: 6	# 元素个数
  • 查看数据的格式
In [27]: data.shape
Out[27]: (2, 3) # 2行三列
  • 数据类型
In [28]: data.dtype
Out[28]: dtype(‘int64‘)
  • 转置
In [29]: data.T
Out[29]: 
array([[2, 4],
       [3, 5],
       [4, 6]])
  • 查看维度
In [22]: data.ndim
Out[22]: 2	# 2维

4 numpy-创建一个数组

  • 创建一个全是0的数组

    • np.zeros(10)
    • 默认为float_
    In [30]: np.zeros(10)
    Out[30]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
    
    • 指定dtype
    In [31]: np.zeros(10,dtype=‘int‘)
    Out[31]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    
  • 创建一个全1的数组

    • np.ones(10)
    • 默认为float
    In [41]: a = np.ones(10)
    Out[41]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
    
    • 指定dtype
    In [44]: a = np.ones(10,dtype=‘int‘)
    Out[45]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    
  • 创建一个空数组

    • np.empty(100)
    • 默认不为空(表示内存总残存的值)
    In [48]: b = np.empty(100)
    Out[48]: 
    array([-3.10503618e+231, -3.10503618e+231,  6.94694804e-310,
            6.94694804e-310,  6.94694804e-310,  5.43472210e-323,
            0.00000000e+000,  3.95252517e-323,  0.00000000e+000,
            0.00000000e+000,  0.00000000e+000,  0.00000000e+000,
    				......
            0.00000000e+000,  0.00000000e+000,  0.00000000e+000,
            0.00000000e+000,  0.00000000e+000,  0.00000000e+000,
            0.00000000e+000,  0.00000000e+000,  0.00000000e+000,
            0.00000000e+000])
    
  • 创建一个连续数组

    • numpy.arange
    • 和python的range相似但是多一个步长可以是小数
    In [50]: np.arange(10)
    Out[50]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [51]: np.arange(1,5)
    Out[51]: array([1, 2, 3, 4])
    
    In [52]: np.arange(1,100,2)
    Out[52]: 
    array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33,
           35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67,
           69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99])
    
    In [53]: np.arange(1,10,0.5)
    Out[53]: 
    array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,
           7.5, 8. , 8.5, 9. , 9.5])
    
  • 指定长度平均拆分

    • np.linspace(a,b,x)
    • 和arange用法相似但是是将a-b之间分为x份
    In [54]: np.linspace(1,10,100)	# 将1-10之间的数字分成100份并且差值相等
    Out[54]: 
    array([ 1.        ,  1.09090909,  1.18181818,  1.27272727,  1.36363636,
            1.45454545,  1.54545455,  1.63636364,  1.72727273,  1.81818182,
            1.90909091,  2.        ,  2.09090909,  2.18181818,  2.27272727,
            2.36363636,  2.45454545,  2.54545455,  2.63636364,  2.72727273,
            2.81818182,  2.90909091,  3.        ,  3.09090909,  3.18181818,
            3.27272727,  3.36363636,  3.45454545,  3.54545455,  3.63636364,
            3.72727273,  3.81818182,  3.90909091,  4.        ,  4.09090909,
            4.18181818,  4.27272727,  4.36363636,  4.45454545,  4.54545455,
            4.63636364,  4.72727273,  4.81818182,  4.90909091,  5.        ,
            5.09090909,  5.18181818,  5.27272727,  5.36363636,  5.45454545,
            5.54545455,  5.63636364,  5.72727273,  5.81818182,  5.90909091,
            6.        ,  6.09090909,  6.18181818,  6.27272727,  6.36363636,
            6.45454545,  6.54545455,  6.63636364,  6.72727273,  6.81818182,
            6.90909091,  7.        ,  7.09090909,  7.18181818,  7.27272727,
            7.36363636,  7.45454545,  7.54545455,  7.63636364,  7.72727273,
            7.81818182,  7.90909091,  8.        ,  8.09090909,  8.18181818,
            8.27272727,  8.36363636,  8.45454545,  8.54545455,  8.63636364,
            8.72727273,  8.81818182,  8.90909091,  9.        ,  9.09090909,
            9.18181818,  9.27272727,  9.36363636,  9.45454545,  9.54545455,
            9.63636364,  9.72727273,  9.81818182,  9.90909091, 10.        ])
    
  • 线性代数的单位矩阵

    • np.eye(10)
    In [56]: np.eye(10)
    Out[56]: 
    array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
    

5.numpy-数组之间的运算

  • 相同维度数组之间只要个数相同,可以进行加减乘除大于小于等各种运算
In [57]: a = np.arange(1,10)
Out[57]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [59]: b = np.arange(11,20)
Out[59]: array([11, 12, 13, 14, 15, 16, 17, 18, 19])

In [61]: a + b
Out[61]: array([12, 14, 16, 18, 20, 22, 24, 26, 28])

In [62]: a - b
Out[62]: array([-10, -10, -10, -10, -10, -10, -10, -10, -10])

In [63]: a * b
Out[63]: array([ 11,  24,  39,  56,  75,  96, 119, 144, 171])

In [64]: a / b
Out[64]: 
array([0.09090909, 0.16666667, 0.23076923, 0.28571429, 0.33333333,
       0.375     , 0.41176471, 0.44444444, 0.47368421])

In [65]: a ** b
Out[65]: 
array([                  1,                4096,             1594323,
                 268435456,         30517578125,       2821109907456,
           232630513987207,   18014398509481984, 1350851717672992089])

In [66]: a > b
Out[66]: array([False, False, False, False, False, False, False, False, False])

6.numpy-普通索引

  • 一维数组
    • 一维数组的索引和列表类似
In [72]: a = np.arange(10)
Out[72]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [74]: a[0]
Out[74]: 0

In [75]: a[1]
Out[75]: 1
  • 二维数组

    • 快速创建一个二维数组
    In [77]: a = np.arange(15).reshape(3,5)	# 把一个0-14的一维数组变成一个3*5的二维数组
    
    In [78]: a
    Out[78]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    
    • 二维数组的索引
    In [78]: a
    Out[78]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    
    In [79]: a[0][0]	# 类似于嵌套列表
    Out[79]: 0
    
    In [80]: a[0,0]		# numpy独有
    Out[80]: 0
    

7.numpy-数组的切片

  • 一维数组的切片

    • 和列表类似
    In [85]: a = np.arange(20)
    
    In [86]: a
    Out[86]: 
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
           17, 18, 19])
    
    In [87]: a[1:10]
    Out[87]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    
  • 二维数组的切片

    • 和取二维数组的索引类似
    In [92]: b
    Out[92]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    
    In [93]: b[2:4,1:]	# 2-4行 之有第2行	1: 表示从1切到最后
    Out[93]: array([[11, 12, 13, 14]])
    
    • 多维数组的切片默认是浅copy不会创建新的对象,如果要创建新的对象可以用.copy()方法
    In [97]: c = b[2:4,1:].copy()
    Out[97]: array([[11, 12, 13, 14]])
    

8.numpy-布尔型索引

  • 通过布尔型索引取值
    • 第一步会进行数组的标量运算:a>5会对每一个元素进行运算,返回一个布尔数组
    • 根据布尔数组的真假返回所有为真的元素
# 给定一个随机数组,筛选出大于5的数
# 方法1 filter()函数
In [99]: import random

In [100]: a = [random.randint(0,20) for i in range(20)]

In [101]: a
Out[101]: [8, 15, 6, 14, 6, 10, 19, 3, 11, 13, 10, 9, 2, 2, 3, 7, 5, 16, 19, 12]

In [102]: filter(lambda x:x>5,a)
Out[102]: <filter at 0x7fe1cfafcd90>

In [103]: list(filter(lambda x:x>5,a))
Out[103]: [8, 15, 6, 14, 6, 10, 19, 11, 13, 10, 9, 7, 16, 19, 12]

# 方法2 array布尔索引
In [104]: a
Out[104]: [8, 15, 6, 14, 6, 10, 19, 3, 11, 13, 10, 9, 2, 2, 3, 7, 5, 16, 19, 12]

In [105]: c = np.array(a)

In [106]: c[c>5]
Out[106]: array([ 8, 15,  6, 14,  6, 10, 19, 11, 13, 10,  9,  7, 16, 19, 12])
  • 布尔索引的本质
In [107]: a = np.arange(4)

In [108]: a
Out[108]: array([0, 1, 2, 3])

In [109]: a[[True,True,False,False]]
Out[109]: array([0, 1])	# 只返回了索引为True的
  • 双布尔索引
    • and --- &
    • or --- |
# 给定一个随机数组,筛选出大于5的数 并且为偶数
# 方法一
In [115]: b = a[a>5]
Out[116]: array([ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

In [117]: c = b[b%2==0]
Out[118]: array([ 6,  8, 10, 12, 14, 16, 18])

# 方法二
In [113]: a
Out[113]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

In [114]: a[(a>5) & (a%2==0)]
Out[114]: array([ 6,  8, 10, 12, 14, 16, 18])

9.numpy-花式索引

  • 双层括号取花式索引
In [125]: a = np.arange(10)

In [126]: a[[1,2,4,6,8]]
Out[126]: array([1, 2, 4, 6, 8])

10.numpy通用函数

10.1 一元函数

  • abs() 绝对值
In [127]: a = np.arange(-5,5)
Out[127]: array([-5, -4, -3, -2, -1,  0,  1,  2,  3,  4])

In [129]: abs(a)
Out[129]: array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4])

In [130]: np.abs(a)
Out[130]: array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4])
  • sqrt() 开方
In [131]: a = np.arange(1,20)

In [132]: np.sqrt(a)
Out[132]: 
array([1.        , 1.41421356, 1.73205081, 2.        , 2.23606798,
       2.44948974, 2.64575131, 2.82842712, 3.        , 3.16227766,
       3.31662479, 3.46410162, 3.60555128, 3.74165739, 3.87298335,
       4.        , 4.12310563, 4.24264069, 4.35889894])
  • exp() 指数运算
In [134]: a
Out[134]: array([1, 2, 3, 4])

In [135]: np.exp(a)
Out[135]: array([ 2.71828183,  7.3890561 , 20.08553692, 54.59815003])
  • log() 对数运算
In [134]: a
Out[134]: array([1, 2, 3, 4])

In [136]: np.log(a)
Out[136]: array([0.        , 0.69314718, 1.09861229, 1.38629436])
  • sin()

  • cos()

  • tan()

  • floor()

  • ceil()

  • round() 四舍五入

  • trunc()

  • rint() == round()

  • np.modf() 小数和整数分开

10.2 二元函数

  • add 加

  • substract 减

  • multiply 乘

  • divide 除

  • power

  • mod

  • maximum 去两个array中最大值

  • mininum 去两个array中最小值

11.numpy-数学方法

  • 数组求和
In [137]: a
Out[137]: array([1, 2, 3, 4])

In [138]: a.sum()
Out[138]: 10
  • 平均值
In [137]: a
Out[137]: array([1, 2, 3, 4])

In [139]: a.mean()
Out[139]: 2.5
  • 标准差-给方差开根号
In [137]: a
Out[137]: array([1, 2, 3, 4])
  
In [141]: a.std()
Out[141]: 1.118033988749895
  • 方差-表示数据的离散程度
In [137]: a
Out[137]: array([1, 2, 3, 4])
  
In [140]: a.var()
Out[140]: 1.25
  • 最小值min
  • 最大值max
  • 最小值索引argmin
  • 最大值索引argmax

12.numpy.random随机数

  • python的random模块
    • random.random() --- 默认取0-1之间的随机数
    • random.randint(1,10) --- 取1-10之间随机整数
    • random.choice([1,2,3,4,5]) --- 取列表中随机数
    • random.shuffle([1,2,3,4,5]) --- 打乱列表
In [142]: import random

In [143]: random.random()
Out[143]: 0.08129507565064709

In [144]: random.random()
Out[144]: 0.544656798663411

In [145]: random.randint(0,10)
Out[145]: 9

In [146]: random.randint(0,10)
Out[146]: 10

In [147]: random.randint(0,10)
Out[147]: 3

In [149]: random.choice([1,2,3,4,5])
Out[149]: 4

In [150]: random.choice([1,2,3,4,5])
Out[150]: 5

In [157]: a = [1,2,3,4,5]

In [158]: random.shuffle(a)

In [159]: a
Out[159]: [3, 1, 5, 4, 2]
  • np.random方法

    • np.random.ranint(1,10) --- 取1-10之间随机整数

    • np.random.ranint(1,10,10) --- 取1-10之间随机整数 取10个组成一个数组

In [162]: np.random.randint(0,10,10)
Out[162]: array([4, 4, 0, 0, 9, 2, 8, 6, 9, 4])
  
In [164]: np.random.randint(0,100,(2,5,5))
Out[164]: 
array([[[74, 91, 75, 12, 13],
        [59, 99, 15, 42, 33],
        [ 9, 62, 60, 63, 55],
        [81, 45, 80, 88, 86],
        [10, 96,  3, 77, 92]],

       [[68, 83, 93, 18, 46],
        [55, 86, 31, 87,  6],
        [53, 91, 58, 78, 37],
        [ 4, 70, 68, 45, 82],
        [23, 73, 53, 75, 53]]])

?

12.numpy-特殊的浮点数

  • nan
    • not a number 表示一个不是浮点数的浮点数
  • inf
    • 表示比任何数都大的浮点数

数据分析-Pandas

1.pandas-安装和使用

2.pandas-第一种数据对象-Series

2.1 pandas-Series-索引类型

  • 有两种索引

    • 数字索引
    • key的索引
    In [166]: pd.Series([1,2,3,4])
    Out[166]: 
    0    1
    1    2
    2    3
    3    4
    dtype: int64
      
    In [167]: pd.Series([1,2,3,4],index=[‘a‘,‘b‘,‘c‘,‘d‘])	# 指定索引是abcd 但索引未被修改 用普通索引还是可以访问
    Out[167]: 
    a    1
    b    2
    c    3
    d    4
    dtype: int64
      
    In [168]: pd.Series(np.arange(5))	# 于numpy结合使用
    Out[168]: 
    0    0
    1    1
    2    2
    3    3
    4    4
    dtype: int64
    

2.2 pandas-Series-标量运算

  • 和标量运算

    In [166]: sr = pd.Series([1,2,3,4])
    Out[166]: 
    0    1
    1    2
    2    3
    3    4
    dtype: int64
    
    In [173]: sr+sr
    Out[173]: 
    0    2
    1    4
    2    6
    3    8
    dtype: int64
      
    

2.3 pandas-Series-传递一个字典

  • 可以传递一个字典

    In [174]:  sr = pd.Series({‘a‘:1,‘b‘:2,‘c‘:3})
    
    In [175]: sr
    Out[175]: 
    a    1
    b    2
    c    3
    dtype: int64
    

2.4 pandas-Series-获取索引/获取值

  • 获取索引/获取值

    In [177]: sr.index
    Out[177]: Index([‘a‘, ‘b‘, ‘c‘], dtype=‘object‘)
    
    In [178]: sr.values
    Out[178]: array([1, 2, 3])
    

2.5 pandas-Series-索引问题

2.5.1 loc/iloc

  • 整数索引问题
    • Series.loc[标签]
    • Series.iloc[索引]
In [6]: sr = pd.Series(np.arange(20))

In [7]: sr
Out[7]: 
0      0
1      1
2      2
......
18    18
19    19
dtype: int64

In [8]: sr2 = sr[10:].copy()

In [9]: sr2
Out[9]: 
10    10
11    11
......
18    18
19    19
dtype: int64
  
In [12]: sr2[10]
Out[12]: 10
  
In [14]: sr2.loc[10]	# loc解析为标签
Out[14]: 10

In [15]: sr2.iloc[0]	# iloc解析为索引
Out[15]: 10
  • Series数据对齐
    • padans对两个Series对象运算的时候会按照标签索引运算
In [16]: sr1 = pd.Series([1,2,3],index=[‘c‘,‘b‘,‘a‘])

In [17]: sr2 = pd.Series([4,5,6],index=[‘b‘,‘a‘,‘c‘])

In [18]: sr1 + sr2
Out[18]: 
a    8
b    6
c    7
dtype: int64
# Series会按照标签(‘a‘,‘b‘,‘c‘)来相加

2.5.2 NaN

  • 缺失数据的方法

    • 出现缺失数据的情况NaN
    In [10]: sr4 = pd.Series([4,5,6,7],index=[‘c‘,‘a‘,‘b‘,‘d‘])
    
    In [11]: sr3 = pd.Series([1,2,3],index=[‘a‘,‘b‘,‘c‘])
    
    In [12]: sr5 = sr3 + sr4
    
    In [14]: sr5
    Out[14]: 
    a    6.0
    b    8.0
    c    7.0
    d    NaN
    dtype: float64
    
  • 判断一行数据里面是不是有NaN

    • isnull()
    In [15]: sr5.isnull()
    Out[15]: 
    a    False
    b    False
    c    False
    d     True	# 表示为NaN
    dtype: bool
    
    • isnotnull()
    In [17]: sr5.notnull()
    Out[17]: 
    a     True
    b     True
    c     True
    d    False
    dtype: bool
    
  • sr5[sr5.notnull()] 判断NaN的方法+布尔索引

    In [18]: sr6 = sr5[sr5.notnull()]
    
    In [19]: sr6
    Out[19]: 
    a    6.0
    b    8.0
    c    7.0
    dtype: float64
    
  • dropna()方法去掉NaN

    In [21]: sr5.dropna()
    Out[21]: 
    a    6.0
    b    8.0
    c    7.0
    dtype: float64
    
  • fillna(0)给NaN赋值

    In [22]: sr5.fillna(0)	# 赋值为0
    Out[22]: 
    a    6.0
    b    8.0
    c    7.0
    d    0.0
    dtype: float64
      
    In [25]: sr5.fillna(sr5.mean())	# sr5.mean() 赋值为平均值
    Out[25]: 
    a    6.0
    b    8.0
    c    7.0
    d    7.0
    dtype: float64
    

2.6 Series总结

  • 数组+字典的结合体

  • 整数索引出现两种情况

    • loc 解释为下表
    • iloc 解释为索引
  • NaN确实数据的处理

    • dropna() 丢掉缺失数据
    • fillna(填充的数据) 填充数据到NaN

3.pandas-二维数据结构-DataFrame

3.1 DataFrame基本信息

3.2 DataFrame 创建方式

# 方式1 不指定索引默认为数字
In [28]: pd.DataFrame({‘one‘:[1,2,3],‘two‘:[4,5,6]})
Out[28]: 
   one  two
0    1    4
1    2    5
2    3    6
# 方式1 指定索引
In [29]: pd.DataFrame({‘one‘:[1,2,3],‘two‘:[4,5,6]},index=[‘a‘,‘b‘,‘c‘])
Out[29]: 
   one  two
a    1    4
b    2    5
c    3    6

# 方式2 要根据索引对齐
In [32]: df = pd.DataFrame({‘one‘:pd.Series([1,2,3],index=[‘a‘,‘b‘,‘c‘]),‘two‘:pd.Series([4,5,6,7],index=[‘c‘,‘a‘,‘b‘,‘d‘])})

In [33]: df
Out[33]: 
   one  two
a  1.0    5
b  2.0    6
c  3.0    4
d  NaN    7

3.3 DataFrame 读取.csv文件为DataFrame

In [35]: pd.read_csv(‘/Users/huhao/1.csv‘)
Out[35]: 
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

3.4 DataFrame 保存数据到.csv

In [36]: df.to_csv(‘/Users/huhao/2.csv‘)

3.5 DataFrame常用属性

"""获取行索引"""
In [44]: df.index
Out[44]: Index([‘a‘, ‘b‘, ‘c‘, ‘d‘], dtype=‘object‘)

"""获取列索引"""
In [48]: df.columns
Out[48]: Index([‘one‘, ‘two‘], dtype=‘object‘)

"""获取数据"""
In [45]: df.values
Out[45]: 
array([[ 1.,  5.],
       [ 2.,  6.],
       [ 3.,  4.],
       [nan,  7.]])
"""转置"""
In [46]: df.T
Out[46]: 
       a    b    c    d
one  1.0  2.0  3.0  NaN
two  5.0  6.0  4.0  7.0

"""返回一些描述"""
In [50]: df.describe()
Out[50]: 
       one       two
count  3.0  4.000000	
mean   2.0  5.500000	
std    1.0  1.290994
min    1.0  4.000000
25%    1.5  4.750000
50%    2.0  5.500000
75%    2.5  6.250000
max    3.0  7.000000

"""df对象对比"""
In [51]: df
Out[51]: 
   one  two
a  1.0    5
b  2.0    6
c  3.0    4
d  NaN    7

3.6 DataFrame的切片和索引

  • 索引
"""df对象对比"""
In [51]: df
Out[51]: 
   one  two
a  1.0    5
b  2.0    6
c  3.0    4
d  NaN    7

# 先行后列 
In [57]: df.loc[‘a‘][‘one‘]
Out[57]: 1.0

# 先行后列
In [58]: df.loc[‘a‘,‘one‘]
Out[58]: 1.0

# 传递一个列表
In [64]: df.loc[[‘a‘,‘b‘,‘c‘],:]
Out[64]: 
   one  two
a  1.0    5
b  2.0    6
c  3.0    4

3.7 DataFrame数据缺失和处理

  • 数据对其需要行索引和列索引都对齐

  • fillna(0)

    • 填充值不影响
  • dropna(how=‘all‘,axis=0)

    • 参数how

    • "any" 一行数据一个是NaN就会删除

      • "all" 一行数据都是NaN才会删除
    • 参数axis

      • 0 默认删除行
      • 1 默认删除列
    • 丢弃数据默认删除行

3.8 DataFrame 常用函数

3.8.1 求平均值-mean()

  • mean(axis=0)
    • axis
      • 0 按列求平均值
      • 1 按行求平均值
In [15]: df = pd.read_csv(‘/Users/huhao/1.csv‘)
Out[15]: 
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

In [18]: df.mean(axis=1)	# 按行求平均值
Out[18]: 
0    2.0
1    5.0
2    8.0
dtype: float64

In [19]: df.mean(axis=0)	# 按列求平均值
Out[19]: 
a    4.0
b    5.0
c    6.0
dtype: float64

3.8.2 求和-sum()

  • sum(axis=0)
    • 参数axis
      • 0 按列求求和
      • 1 按行求求和
In [20]: df
Out[20]: 
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

In [21]: df.sum()	# 默认按列求和
Out[21]: 
a    12
b    15
c    18
dtype: int64

In [22]: df.sum(axis=0)	# 按列求和
Out[22]: 
a    12
b    15
c    18
dtype: int64

In [23]: df.sum(axis=1) # 按行求和
Out[23]: 
0     6
1    15
2    24
dtype: int64

3.8.3 排序-sort_values()

  • sort_values(by=‘列名‘)
    • 参数by
      • 列名 按列名去排序
    • axis
      • 0 按列排序
      • 1 按行排序
    • ascending
      • False 降序
      • True 升序
  • 有NaN的部分不参与排序,全部放在最后面

3.8.4 Series对象的其他方法也适用于DataFrame

  • Series对象的其他方法也适用于DataFrame

3.9 DataFrame 处理时间

  • python处理时间

    • datetime&time

    • dateutil

      • dateutil更强大
      import dateutil
      dateutil.parser.parse(‘2020-12-12‘)
      dateutil.parser.parse(‘2020/12/12‘)
      dateutil.parser.parse(‘2020/DEC/12‘)
      
  • pandas处理时间

    • pandas.to_datetime()
    In [12]: pd.to_datetime([‘2020-12-13‘,‘2020/02/12‘])
    Out[12]: DatetimeIndex([‘2020-12-13‘, ‘2020-02-12‘], dtype=‘datetime64[ns]‘, freq=None)
    
    • pandas.date_range()

      • 参数 start 起始时间

        • start = "2020-12-11"
      • 参数 end 终止时间

        • end = " 2020-12-20"
      • 参数 periods 时间跨度

        • periods = 30
      • 参数 freq

        • freq = "D" 按天

        • freq = "w" 按周

          • freq = "W-MON" 按周按周一
        • freq = "H" 按小时

        • freq = "B" 工作日

      In [14]: pd.date_range(‘2020-01-01‘,‘2020-01-30‘)	# 设置起始时间
      Out[14]: 
      DatetimeIndex([‘2020-01-01‘, ‘2020-01-02‘, ‘2020-01-03‘, ‘2020-01-04‘,
                     ‘2020-01-05‘, ‘2020-01-06‘, ‘2020-01-07‘, ‘2020-01-08‘,
                     ‘2020-01-09‘, ‘2020-01-10‘, ‘2020-01-11‘, ‘2020-01-12‘,
                     ‘2020-01-13‘, ‘2020-01-14‘, ‘2020-01-15‘, ‘2020-01-16‘,
                     ‘2020-01-17‘, ‘2020-01-18‘, ‘2020-01-19‘, ‘2020-01-20‘,
                     ‘2020-01-21‘, ‘2020-01-22‘, ‘2020-01-23‘, ‘2020-01-24‘,
                     ‘2020-01-25‘, ‘2020-01-26‘, ‘2020-01-27‘, ‘2020-01-28‘,
                     ‘2020-01-29‘, ‘2020-01-30‘],
                    dtype=‘datetime64[ns]‘, freq=‘D‘)
      
      In [15]: pd.date_range(‘2020-01-01‘,periods=30)	# 设置开始时间和时间跨度
      Out[15]: 
      DatetimeIndex([‘2020-01-01‘, ‘2020-01-02‘, ‘2020-01-03‘, ‘2020-01-04‘,
                     ‘2020-01-05‘, ‘2020-01-06‘, ‘2020-01-07‘, ‘2020-01-08‘,
                     ‘2020-01-09‘, ‘2020-01-10‘, ‘2020-01-11‘, ‘2020-01-12‘,
                     ‘2020-01-13‘, ‘2020-01-14‘, ‘2020-01-15‘, ‘2020-01-16‘,
                     ‘2020-01-17‘, ‘2020-01-18‘, ‘2020-01-19‘, ‘2020-01-20‘,
                     ‘2020-01-21‘, ‘2020-01-22‘, ‘2020-01-23‘, ‘2020-01-24‘,
                     ‘2020-01-25‘, ‘2020-01-26‘, ‘2020-01-27‘, ‘2020-01-28‘,
                     ‘2020-01-29‘, ‘2020-01-30‘],
                    dtype=‘datetime64[ns]‘, freq=‘D‘)
      

3.10 DataFrame 时间序列

  • 字符串切片

    In [9]: sr = pd.Series(np.arange(1000),index=pd.date_range(‘2020-01-01‘,periods=1000))
    
    In [10]: sr
    Out[10]: 
    2020-01-01      0
    2020-01-02      1
    2020-01-03      2
    2020-01-04      3
    2020-01-05      4
                 ... 
    2022-09-22    995
    2022-09-23    996
    2022-09-24    997
    2022-09-25    998
    2022-09-26    999
    Freq: D, Length: 1000, dtype: int64
    
    In [14]: sr[‘2020‘:‘2021-03‘]	# 截取2020年至2021年3月的数据
    Out[14]: 
    2020-01-01      0
    2020-01-02      1
    2020-01-03      2
    2020-01-04      3
    2020-01-05      4
                 ... 
    2021-03-27    451
    2021-03-28    452
    2021-03-29    453
    2021-03-30    454
    2021-03-31    455
    Freq: D, Length: 456, dtype: int64
    
  • 函数的使用

    • resample()

      • 参数
        • W 一周的
        • M 一月的
        • .sum() 和
        • .mean() 平均的
      In [16]: sr2
      Out[16]: 
      2020-01-01     0
      2020-01-02     1
      2020-01-03     2
      2020-01-04     3
      ......
      2020-01-30    29
      2020-01-31    30
      2020-02-01    31
      Freq: D, dtype: int64
      
      In [17]: sr2.resample(‘W‘)
      Out[17]: <pandas.core.resample.DatetimeIndexResampler object at 0x7fe58d136d50>
      
      In [18]: sr2.resample(‘W‘).sum()
      Out[18]: 
      2020-01-05     10
      2020-01-12     56
      2020-01-19    105
      2020-01-26    154
      2020-02-02    171
      Freq: W-SUN, dtype: int64
      
    • truncate()

      In [19]: sr.truncate(before=‘2021-06-01‘)
      Out[19]: 
      2021-06-01    517
      2021-06-02    518
      2021-06-03    519
      2021-06-04    520
      2021-06-05    521
                   ... 
      2022-09-22    995
      2022-09-23    996
      2022-09-24    997
      2022-09-25    998
      2022-09-26    999
      Freq: D, Length: 483, dtype: int64
      
  • dataframe操作时间序列

    """
    1.set index
    res = df.set_index(keys=[‘date‘])
    2. 索引转为时间对象
    res.index = pd.to_datetime(res.index)
    3. 用loc切片
    res.loc[‘2010-05-09‘:‘2010-05-16‘]
    """
    

3.11 DataFrame 文件的处理

  • pd.read_csv(file_path, index_col="date", parse_dates=True, header=None, names = [])
    • 参数
      • file_path 文件路径
      • index_col="date" # 指定某一行为索引
      • parse_dates # 把能解释为时间的都解释为时间
        • 布尔 parse_dates=True
        • 列表传列名 parse_dates=[‘date‘]
      • header=None # 不要列名
      • names = []
        • 自己指定列名
  • pd.read_table()

【数据分析-numpy-pandas】

标签:cfa   对象   --   标准   cos   pytho   访问   适用于   总结   

原文地址:https://www.cnblogs.com/gokublog/p/14610065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!