鱼C论坛

 找回密码
 立即注册
查看: 1658|回复: 2

[技术交流] python之pandas的基本使用

[复制链接]
发表于 2020-4-1 09:47:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python之pandas的基本使用

一、pandas概述
pandas :pannel data analysis(面板数据分析)。pandas是基于numpy构建的,为时间序列分析提供了很好的支持。pandas中有两个主要的数据结构,一个是Series,另一个是DataFrame。

二、数据结构 Series
Series 类似于一维数组与字典(map)数据结构的结合。它由一组数据和一组与数据相对应的数据标签(索引index)组成。这组数据和索引标签的基础都是一个一维ndarray数组。可将index索引理解为行索引。 Series的表现形式为:索引在左,数据在右。


• 获取数据和索引:ser_obj.index, ser_obj.values


• 预览数据:ser_obj.head(n), ser_obj.tail(n)


Series的使用代码示例:
  1. import pandas as pd
  2. from pandas import Series,DataFrame

  3. print '用一维数组生成Series'
  4. x = Series([1,2,3,4])
  5. print x
  6. '''
  7. 0    1
  8. 1    2
  9. 2    3
  10. 3    4
  11. '''
  12. print x.values # [1 2 3 4]
  13. # 默认标签为0到3的序号
  14. print x.index # RangeIndex(start=0, stop=4, step=1)

  15. print '指定Series的index' # 可将index理解为行索引
  16. x = Series([1, 2, 3, 4], index = ['a', 'b', 'd', 'c'])
  17. print x
  18. '''
  19. a    1
  20. b    2
  21. d    3
  22. c    4
  23. '''
  24. print x.index # Index([u'a', u'b', u'd', u'c'], dtype='object')
  25. print x['a'] # 通过行索引来取得元素值:1
  26. x['d'] = 6 # 通过行索引来赋值
  27. print x[['c', 'a', 'd']] # 类似于numpy的花式索引
  28. '''
  29. c    4
  30. a    1
  31. d    6
  32. '''
  33. print x[x > 2]  # 类似于numpy的布尔索引
  34. '''
  35. d    6
  36. c    4
  37. '''
  38. print 'b' in x # 类似于字典的使用:是否存在该索引:True
  39. print 'e' in x # False


  40. print '使用字典来生成Series'
  41. data = {'a':1, 'b':2, 'd':3, 'c':4}
  42. x = Series(data)
  43. print x
  44. '''
  45. a    1
  46. b    2
  47. c    4
  48. d    3
  49. '''
  50. print '使用字典生成Series,并指定额外的index,不匹配的索引部分数据为NaN。'
  51. exindex = ['a', 'b', 'c', 'e']
  52. y = Series(data, index = exindex) # 类似替换索引
  53. print y
  54. '''
  55. a    1.0
  56. b    2.0
  57. c    4.0
  58. e    NaN
  59. '''
  60. print 'Series相加,相同行索引相加,不同行索引则数值为NaN'
  61. print x+y
  62. '''
  63. a    2.0
  64. b    4.0
  65. c    8.0
  66. d    NaN
  67. e    NaN
  68. '''
  69. print '指定Series/索引的名字'
  70. y.name = 'weight of letters'
  71. y.index.name = 'letter'
  72. print y
  73. '''
  74. letter
  75. a    1.0
  76. b    2.0
  77. c    4.0
  78. e    NaN
  79. Name: weight of letters, dtype: float64
  80. '''
  81. print '替换index'
  82. y.index = ['a', 'b', 'c', 'f']
  83. print y # 不匹配的索引部分数据为NaN
  84. '''
  85. a    1.0
  86. b    2.0
  87. c    4.0
  88. f    NaN
  89. Name: weight of letters, dtype: float64
  90. '''
复制代码
三、数据结构 DataFrame
DataFrame是一个类似表格的数据结构,索引包括列索引和行索引,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame的每一行和每一列都是一个Series,这个Series的name属性为当前的行索引名/列索引名。


通过列索引获取列数据(Series类型 ):df_obj[col_idx] 或 df_obj.col_idx


.ix,标签与位置混合索引


可输入给DataFrame构造器的数据:
20170118132516344.jpg



DataFrame的使用代码示例:


  1. print '使用字典生成DataFrame,key为列名字。'
  2. data = {'state':['ok', 'ok', 'good', 'bad'],
  3.         'year':[2000, 2001, 2002, 2003],
  4.         'pop':[3.7, 3.6, 2.4, 0.9]}
  5. print DataFrame(data) # 行索引index默认为0,1,2,3
  6. '''
  7.    pop state  year
  8. 0  3.7    ok  2000
  9. 1  3.6    ok  2001
  10. 2  2.4  good  2002
  11. 3  0.9   bad  2003
  12. '''
  13. # 指定列索引columns,不匹配的列为NaN
  14. print DataFrame(data, columns = ['year', 'state', 'pop','debt'])
  15. '''
  16.    year state  pop
  17. 0  2000    ok  3.7
  18. 1  2001    ok  3.6
  19. 2  2002  good  2.4
  20. 3  2003   bad  0.9
  21. '''
  22. print '指定行索引index'
  23. x = DataFrame(data,
  24.                     columns = ['year', 'state', 'pop', 'debt'],
  25.                     index = ['one', 'two', 'three', 'four'])
  26. print x
  27. '''
  28.        year state  pop debt
  29. one    2000    ok  3.7  NaN
  30. two    2001    ok  3.6  NaN
  31. three  2002  good  2.4  NaN
  32. four   2003   bad  0.9  NaN
  33. '''

  34. import numpy
  35. print 'DataFrame元素的索引与修改'
  36. print x['state'] # 返回一个名为state的Series
  37. '''
  38. one        ok
  39. two        ok
  40. three    good
  41. four      bad
  42. Name: state, dtype: object
  43. '''
  44. print x.state # 可直接用.进行列索引
  45. print x.ix['three'] # 用.ix[]来区分[]进行行索引
  46. '''
  47. year     2002
  48. state    good
  49. pop       2.4
  50. debt      NaN
  51. Name: three, dtype: object
  52. '''
  53. x['debt'] = 16.5 # 修改一整列数据
  54. print x
  55. '''
  56.        year state  pop  debt
  57. one    2000    ok  3.7  16.5
  58. two    2001    ok  3.6  16.5
  59. three  2002  good  2.4  16.5
  60. four   2003   bad  0.9  16.5
  61. '''
  62. x.debt = numpy.arange(4)  # 用numpy数组修改元素
  63. print x
  64. '''
  65.        year state  pop  debt
  66. one    2000    ok  3.7     0
  67. two    2001    ok  3.6     1
  68. three  2002  good  2.4     2
  69. four   2003   bad  0.9     3
  70. '''

  71. print '用Series修改元素,没有指定的默认数据用NaN'
  72. val = Series([-1.2, -1.5, -1.7,0], index = ['one', 'two', 'five','six'])
  73. x.debt = val # DataFrame的行索引不变
  74. print x
  75. '''
  76.        year state  pop  debt
  77. one    2000    ok  3.7  -1.2
  78. two    2001    ok  3.6  -1.5
  79. three  2002  good  2.4   NaN
  80. four   2003   bad  0.9   NaN
  81. '''

  82. print '给DataFrame添加新列'
  83. x['gain'] = (x.debt > 0)  # 如果debt大于0为True
  84. print x
  85. '''
  86.        year state  pop  debt   gain
  87. one    2000    ok  3.7  -1.2  False
  88. two    2001    ok  3.6  -1.5  False
  89. three  2002  good  2.4   NaN  False
  90. four   2003   bad  0.9   NaN  False
  91. '''
  92. print x.columns
  93. # Index([u'year', u'state', u'pop', u'debt', u'gain'], dtype='object')

  94. print 'DataFrame转置'
  95. print x.T
  96. '''
  97.          one    two  three   four
  98. year    2000   2001   2002   2003
  99. state     ok     ok   good    bad
  100. pop      3.7    3.6    2.4    0.9
  101. debt    -1.2   -1.5    NaN    NaN
  102. gain   False  False  False  False
  103. '''

  104. print '使用切片初始化数据,未被匹配的数据为NaN'
  105. pdata = {'state':x['state'][0:3], 'pop':x['pop'][0:2]}
  106. y = DataFrame(pdata)
  107. print y
  108. '''
  109.        pop state
  110. one    3.7    ok
  111. three  NaN  good
  112. two    3.6    ok
  113. '''

  114. print '指定索引和列的名称'
  115. # 与Series的index.name相区分
  116. y.index.name = '序号'
  117. y.columns.name = '信息'
  118. print y
  119. '''
  120. 信息 pop state
  121. 序号              
  122. one    3.7    ok
  123. three  NaN  good
  124. two    3.6    ok
  125. '''
  126. print y.values
  127. '''
  128. [[3.7 'ok']
  129. [nan 'good']
  130. [3.6 'ok']]
  131. '''
复制代码


四、索引对象

pandas的索引对象负责管理轴标签和轴名称等。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index对象。 Index对象是不可修改的,Series和DataFrame中的索引都是Index对象。

代码示例:

  1. from pandas import Index
  2. print '获取Index对象'
  3. x = Series(range(3), index = ['a', 'b', 'c'])
  4. index = x.index
  5. print index
  6. # Index([u'a', u'b', u'c'], dtype='object')
  7. print index[0:2]
  8. # Index([u'a', u'b'], dtype='object')
  9. try:
  10.     index[0]='d'
  11. except:
  12.     print "Index is immutable"

  13. print '构造/使用Index对象'
  14. index = Index(numpy.arange(3))
  15. obj2 = Series([1.5, -2.5, 0], index = index)
  16. print obj2
  17. '''
  18. 0    1.5
  19. 1   -2.5
  20. 2    0.0
  21. dtype: float64
  22. '''
  23. print obj2.index is index # True


  24. print '判断列/行索引是否存在'
  25. data = {'pop':{2.4, 2.9},
  26.         'year':{2001, 2002} }
  27. x = DataFrame(data)
  28. print x
  29. '''
  30.           pop          year
  31. 0  {2.4, 2.9}  {2001, 2002}
  32. 1  {2.4, 2.9}  {2001, 2002}
  33. '''
  34. print 'pop' in x.columns # True
  35. print 1 in x.index # True
复制代码


五、基本功能

对列/行索引重新指定索引(删除/增加:行/列):reindex函数

reindex的method选项:

20170118164406291.jpg

代码示例:

  1. print '重新指定索引及NaN填充值'
  2. x = Series([4, 7, 5], index = ['a', 'b', 'c'])
  3. y = x.reindex(['a', 'b', 'c', 'd'])
  4. print y
  5. '''
  6. a    4.0
  7. b    7.0
  8. c    5.0
  9. d    NaN
  10. dtype: float64
  11. '''
  12. print x.reindex(['a', 'b', 'c', 'd'], fill_value = 0)
  13. # fill_value 指定不存在元素NaN的默认值
  14. '''
  15. a    4
  16. b    7
  17. c    5
  18. d    0
  19. dtype: int64
  20. '''

  21. print '重新指定索引并指定填充NaN的方法'
  22. x = Series(['blue', 'purple'], index = [0, 2])
  23. print x.reindex(range(4), method = 'ffill')
  24. '''
  25. 0      blue
  26. 1      blue
  27. 2    purple
  28. 3    purple
  29. dtype: object
  30. '''

  31. print '对DataFrame重新指定行/列索引'
  32. x = DataFrame(numpy.arange(9).reshape(3, 3),
  33.                   index = ['a', 'c', 'd'],
  34.                   columns = ['A', 'B', 'C'])
  35. print x
  36. '''
  37.    A  B  C
  38. a  0  1  2
  39. c  3  4  5
  40. d  6  7  8
  41. '''
  42. x =  x.reindex(['a', 'b', 'c', 'd'],method = 'bfill')
  43. print x
  44. '''
  45.    A  B  C
  46. a  0  1  2
  47. b  3  4  5
  48. c  3  4  5
  49. d  6  7  8
  50. '''
  51. print '重新指定column'
  52. states = ['A', 'B', 'C','D']
  53. x =  x.reindex(columns = states,fill_value = 0)
  54. print x
  55. '''
  56.    A  B  C  D
  57. a  0  1  2  0
  58. b  3  4  5  0
  59. d  6  7  8  0
  60. c  3  4  5  0
  61. '''
  62. print x.ix[['a', 'b', 'd', 'c'], states]
  63. '''
  64.    A  B  C  D
  65. a  0  1  2  0
  66. b  3  4  5  0
  67. d  6  7  8  0
  68. c  3  4  5  0
  69. '''
复制代码

删除(丢弃)整一行/列的元素:drop函数

  1. print 'Series根据行索引删除行'
  2. x = Series(numpy.arange(4), index = ['a', 'b', 'c','d'])
  3. print x.drop('c')
  4. '''
  5. a    0
  6. b    1
  7. d    3
  8. dtype: int32
  9. '''
  10. print x.drop(['a', 'b'])  #  花式删除
  11. '''
  12. c    2
  13. d    3
  14. dtype: int32
  15. '''

  16. print 'DataFrame根据索引行/列删除行/列'
  17. x = DataFrame(numpy.arange(16).reshape((4, 4)),
  18.                   index = ['a', 'b', 'c', 'd'],
  19.                   columns = ['A', 'B', 'C', 'D'])
  20. print x
  21. '''
  22.     A   B   C   D
  23. a   0   1   2   3
  24. b   4   5   6   7
  25. c   8   9  10  11
  26. d  12  13  14  15
  27. '''
  28. print x.drop(['A','B'],axis=1) # 在列的维度上删除AB两行
  29. '''
  30.     C   D
  31. a   2   3
  32. b   6   7
  33. c  10  11
  34. d  14  15
  35. '''
  36. print x.drop('a', axis = 0) # 在行的维度上删除行
  37. '''
  38.     A   B   C   D
  39. b   4   5   6   7
  40. c   8   9  10  11
  41. d  12  13  14  15
  42. '''
  43. print x.drop(['a', 'b'], axis = 0)
  44. '''
  45.   A   B   C   D
  46. c   8   9  10  11
  47. d  12  13  14  15
  48. '''
复制代码

索引、选取和过滤:

DataFrame的索引选项:

20170118174348085.jpg

  1. print 'Series的数组索引/字典索引'
  2. x = Series(numpy.arange(4), index = ['a', 'b', 'c', 'd'])
  3. print x['b'] # 1 像字典一样索引
  4. print x[1] # 1  像数组一样索引
  5. print x[[1, 3]] # 花式索引
  6. '''
  7. b    1
  8. d    3
  9. dtype: int32
  10. '''
  11. print x[x < 2] # 布尔索引
  12. '''
  13. a    0
  14. b    1
  15. dtype: int32
  16. '''
  17. print 'Series的数组切片'
  18. print x['a':'c']  # 闭区间,索引顺序须为前后
  19. '''
  20. a    0
  21. b    1
  22. c    2
  23. '''
  24. x['a':'c'] = 5
  25. print x
  26. '''
  27. a    5
  28. b    5
  29. c    5
  30. d    3
  31. '''

  32. print 'DataFrame的索引'
  33. data = DataFrame(numpy.arange(16).reshape((4, 4)),
  34.                   index = ['a', 'b', 'c', 'd'],
  35.                   columns = ['A', 'B', 'C', 'D'])
  36. print data
  37. '''
  38.     A   B   C   D
  39. a   0   1   2   3
  40. b   4   5   6   7
  41. c   8   9  10  11
  42. d  12  13  14  15
  43. '''
  44. print data['A'] # 打印列
  45. '''
  46. a     0
  47. b     4
  48. c     8
  49. d    12
  50. Name: A, dtype: int32
  51. '''
  52. print data[['A', 'B']] # 花式索引
  53. '''
  54.     A   B
  55. a   0   1
  56. b   4   5
  57. c   8   9
  58. d  12  13
  59. '''
  60. print data[:2] # 切片索引,选择行
  61. '''
  62.    A  B  C  D
  63. a  0  1  2  3
  64. b  4  5  6  7
  65. '''
  66. print data.ix[:2, ['A', 'B']] # 指定行和列索引
  67. '''
  68.    A  B
  69. a  0  1
  70. b  4  5
  71. '''
  72. print data.ix[['a', 'b'], [3, 0, 1]] #行:字典索引,列:数组索引
  73. '''
  74.    D  A  B
  75. a  3  0  1
  76. b  7  4  5
  77. '''
  78. print data.ix[2]  # 打印第2行(从0开始)
  79. '''
  80. A     8
  81. B     9
  82. C    10
  83. D    11
  84. '''
  85. print data.ix[:'b', 'A'] # 行从开始到b,第A列。
  86. '''
  87. a    0
  88. b    4
  89. Name: A, dtype: int32
  90. '''
  91. print '根据条件选择'
  92. print data
  93. '''
  94.     A   B   C   D
  95. a   0   1   2   3
  96. b   4   5   6   7
  97. c   8   9  10  11
  98. d  12  13  14  15
  99. '''
  100. print data[data.A > 5] # 根据条件选择行
  101. '''
  102.     A   B   C   D
  103. c   8   9  10  11
  104. d  12  13  14  15
  105. '''
  106. print data < 5  # 打印True或者False
  107. '''
  108.        A      B      C      D
  109. a   True   True   True   True
  110. b   True  False  False  False
  111. c  False  False  False  False
  112. d  False  False  False  False
  113. '''
  114. data[data < 5] = 0 # 条件索引
  115. print data
  116. '''
  117.     A   B   C   D
  118. a   0   0   0   0
  119. b   0   5   6   7
  120. c   8   9  10  11
  121. d  12  13  14  15
  122. '''
复制代码

算术运算和数据对齐

代码示例:

  1. print 'DataFrame算术:不重叠部分为NaN,重叠部分元素运算'
  2. x = DataFrame(numpy.arange(9.).reshape((3, 3)),
  3.                 columns = ['A','B','C'],
  4.                 index = ['a', 'b', 'c'])
  5. y = DataFrame(numpy.arange(12).reshape((4, 3)),
  6.                 columns = ['A','B','C'],
  7.                 index = ['a', 'b', 'c', 'd'])
  8. print x
  9. print y
  10. print x + y
  11. '''
  12.       A     B     C
  13. a   0.0   2.0   4.0
  14. b   6.0   8.0  10.0
  15. c  12.0  14.0  16.0
  16. d   NaN   NaN   NaN
  17. '''
  18. print '对x/y的不重叠部分填充,不是对结果NaN填充'
  19. print x.add(y, fill_value = 0) # x不变化
  20. '''

  21.       A     B     C
  22. a   0.0   2.0   4.0
  23. b   6.0   8.0  10.0
  24. c  12.0  14.0  16.0
  25. d   9.0  10.0  11.0
  26. '''

  27. print 'DataFrame与Series运算:每行/列进行运算'
  28. frame = DataFrame(numpy.arange(9).reshape((3, 3)),
  29.                   columns = ['A','B','C'],
  30.                   index = ['a', 'b', 'c'])
  31. series = frame.ix[0]
  32. print frame
  33. '''
  34.    A  B  C
  35. a  0  1  2
  36. b  3  4  5
  37. c  6  7  8
  38. '''
  39. print series
  40. '''
  41. A    0
  42. B    1
  43. C    2
  44. '''
  45. print frame - series # 默认按行运算
  46. '''
  47.    A  B  C
  48. a  0  0  0
  49. b  3  3  3
  50. c  6  6  6
  51. '''
  52. series2 = Series(range(4), index = ['A','B','C','D'])
  53. print frame + series2 # 按行运算:缺失列则为NaN
  54. '''
  55.    A  B   C   D
  56. a  0  2   4 NaN
  57. b  3  5   7 NaN
  58. c  6  8  10 NaN
  59. '''
  60. series3 = frame.A
  61. print series3
  62. '''
  63. a    0
  64. b    3
  65. c    6
  66. '''
  67. print frame.sub(series3, axis = 0)  # 按列运算。
  68. '''
  69.    A  B  C
  70. a  0  1  2
  71. b  0  1  2
  72. c  0  1  2
  73. '''
复制代码

numpy函数应用与映射

代码示例:

  1. print 'numpy函数在Series/DataFrame的应用'
  2. frame = DataFrame(numpy.arange(9).reshape(3,3),
  3.                   columns = ['A','B','C'],
  4.                   index = ['a', 'b', 'c'])
  5. print frame
  6. '''
  7.    A  B  C
  8. a  0  1  2
  9. b  3  4  5
  10. c  6  7  8
  11. '''
  12. print numpy.square(frame)
  13. '''
  14.     A   B   C
  15. a   0   1   4
  16. b   9  16  25
  17. c  36  49  64
  18. '''

  19. series = frame.A
  20. print series
  21. '''
  22. a    0
  23. b    3
  24. c    6
  25. '''
  26. print numpy.square(series)
  27. '''
  28. a     0
  29. b     9
  30. c    36
  31. '''


  32. print 'lambda(匿名函数)以及应用'
  33. print frame
  34. '''

  35.    A  B  C
  36. a  0  1  2
  37. b  3  4  5
  38. c  6  7  8
  39. '''
  40. print frame.max()
  41. '''
  42. A    6
  43. B    7
  44. C    8
  45. '''
  46. f = lambda x: x.max() - x.min()
  47. print frame.apply(f) # 作用到每一列
  48. '''
  49. A    6
  50. B    6
  51. C    6
  52. '''
  53. print frame.apply(f, axis = 1) # 作用到每一行
  54. '''
  55. a    2
  56. b    2
  57. c    2
  58. '''
  59. def f(x): # Series的元素的类型为Series
  60.     return Series([x.min(), x.max()], index = ['min', 'max'])
  61. print frame.apply(f)
  62. '''
  63.      A  B  C
  64. min  0  1  2
  65. max  6  7  8
  66. '''

  67. print 'applymap和map:作用到每一个元素'
  68. _format = lambda x: '%.2f' % x
  69. print frame.applymap(_format) # 针对DataFrame
  70. '''
  71.       A     B     C
  72. a  0.00  1.00  2.00
  73. b  3.00  4.00  5.00
  74. c  6.00  7.00  8.00
  75. '''
  76. print frame['A'].map(_format) # 针对Series
  77. '''
  78. a    0.00
  79. b    3.00
  80. c    6.00
  81. Name: A, dtype: object
  82. '''
复制代码

版权声明:本文为CSDN博主「cxmscb」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/cxmscb/article/details/54632492


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 09:49:37 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-1 09:53:26 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-18 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表