官方文档

1. 安装Pandas

  1. windoscmdpip install pandas
  2. 导入pandas包:import pandas as pd

2. Series对象

带索引的一维数组

  1. 创建:
  2. s = pd.Series([12,-4,7,9])
  3. print (s)
  4. 0 12
  5. 1 -4
  6. 2 7
  7. 3 9
  8. dtype: int64
  9. s = pd.Series([12,-4,7,9], index = ['a', 'b', 'c', 'd'])
  10. print (s)
  11. a 12
  12. b -4
  13. c 7
  14. d 9
  15. dtype: int64
  16. 查看元素
  17. print(s.values)
  18. [12 -4 7 9]
  19. 查看索引标签
  20. print(s.index)
  21. Index(['a', 'b', 'c', 'd'], dtype='object')
  22. 使用NumPy数组定义Series对象
  23. >>> arr = np.array([1,2,3,4])
  24. >>> s3 = pd.Series(arr)
  25. >>> s3
  26. 0 1
  27. 1 2
  28. 2 3
  29. 3 4
  30. dtype: int32
  31. 使用Series对象也可以定义NumPy数组
  32. >>> arr = np.array(s)
  33. >>> arr
  34. array([12, -4, 7, 9], dtype=int64)
  35. Series对象当做字典
  36. >>> dict = {'red':200, 'blue':20, 'orange':10}
  37. >>> s = pd.Series(dict)
  38. >>> s
  39. blue 20
  40. orange 10
  41. red 200
  42. dtype: int64
  43. >>> dict
  44. {'red': 200, 'orange': 10, 'blue': 20}
  45. 在上例的基础上
  46. >>> dict = {'red':100, 'blue':30, 'black':50}
  47. >>> ss = pd.Series(dict)
  48. >>> ss + s
  49. black NaN
  50. blue 50.0
  51. orange NaN
  52. red 300.0
  53. dtype: float64
  54. >>> ss - s
  55. black NaN
  56. blue 10.0
  57. orange NaN
  58. red -100.0
  59. dtype: float64
  60. 说明Series对象相运算都是取索引的标签的交集进行运算,没有交集的值为NaN

2. DataFrame对象

类似于Excel表。设计初衷是将Series由一维拓展到多维。

2.1. 定义

  1. >>> data = {'color' : ['blue','green','yellow','red','white'],
  2. ... 'object' : ['ball','pen','pencil','paper','mug'],
  3. ... 'price' : [1.2,1.0,0.6,0.9,1.7]}
  4. >>> frame = pd.DataFrame(data)
  5. >>> frame
  6. color object price
  7. 0 blue ball 1.2
  8. 1 green pen 1.0
  9. 2 yellow pencil 0.6
  10. 3 red paper 0.9
  11. 4 white mug 1.7
  12. 可以只创建部分的列
  13. >>> frame2 = pd.DataFrame(data, columns=['object','price'])
  14. >>> frame2
  15. object price
  16. 0 ball 1.2
  17. 1 pen 1.0
  18. 2 pencil 0.6
  19. 3 paper 0.9
  20. 4 mug 1.7
  21. Series一样可以指明索引的标签
  22. >>> frame3 = pd.DataFrame(data, index = ['a', 'b', 'c', 'd', 'e'])
  23. >>> frame3
  24. color object price
  25. a blue ball 1.2
  26. b green pen 1.0
  27. c yellow pencil 0.6
  28. d red paper 0.9
  29. e white mug 1.7
  30. 使用np.array快速创建
  31. >>> frame4 = pd.DataFrame(np.arange(16).reshape((4,4)), index = ['red', 'blue', 'yellow', 'white'], columns = ['ball', 'pen', 'pencil', 'paper'])
  32. >>> frame4
  33. ball pen pencil paper
  34. red 0 1 2 3
  35. blue 4 5 6 7
  36. yellow 8 9 10 11
  37. white 12 13 14 15
  38. 使用嵌套字典创建(可以看出列是一级字典的键值,索引标签是二级字典的键值)
  39. >>> dict = {'red' : {1000: 1, 2000: 2}, 'blue' : {3000: 3, 4000: 4}, 'orange' : {1000: 10, 3000: 30}}
  40. >>> frame = pd.DataFrame(dict)
  41. >>> frame
  42. blue orange red
  43. 1000 NaN 10.0 1.0
  44. 2000 NaN NaN 2.0
  45. 3000 3.0 30.0 NaN
  46. 4000 4.0 NaN NaN

2.2. 选取元素

  1. Series类似,多了一个查看列名
  2. >>> frame4.columns
  3. Index(['ball', 'pen', 'pencil', 'paper'], dtype='object')
  4. >>> frame4.index
  5. Index(['red', 'blue', 'yellow', 'white'], dtype='object')
  6. >>> frame4.values
  7. array([[ 0, 1, 2, 3],
  8. [ 4, 5, 6, 7],
  9. [ 8, 9, 10, 11],
  10. [12, 13, 14, 15]])
  11. 查看列信息
  12. >>> frame4['pencil']
  13. red 2
  14. blue 6
  15. yellow 10
  16. white 14
  17. Name: pencil, dtype: int32
  18. 查看行信息
  19. >>> frame4.ix[2]
  20. ball 8
  21. pen 9
  22. pencil 10
  23. paper 11
  24. Name: yellow, dtype: int32
  25. 同时可以使用切片来查询行信息
  26. >>> frame4[1:3]
  27. ball pen pencil paper
  28. blue 4 5 6 7
  29. yellow 8 9 10 11
  30. 查找具体的元素,用索引和用索引的标签都是一样的(这里应该先用列再用行..本来都是习惯先行再列的)
  31. >>> frame4['pencil'][1]
  32. 6
  33. >>> frame4['pencil']['blue']
  34. 6

2.3. 赋值和删除

  1. indexcolumns设置标签
  2. >>> frame4.index.name = '茵蒂克丝'(我只是个魔禁粉)
  3. >>> frame4.columns.name = '考拉能丝'(为了协调)
  4. >>> frame4
  5. 考拉能丝 ball pen pencil paper
  6. 茵蒂克丝
  7. red 0 1 2 3
  8. blue 4 5 6 7
  9. yellow 8 9 10 11
  10. white 12 13 14 15
  11. 添加新的列
  12. >>> frame4['new'] = [101, 102, 103, 104]
  13. >>> frame4
  14. 考拉能丝 ball pen pencil paper new
  15. 茵蒂克丝
  16. red 0 1 2 3 101
  17. blue 4 5 6 7 102
  18. yellow 8 9 10 11 103
  19. white 12 13 14 15 104
  20. >>> frame4['newnew'] = 1000
  21. >>> frame4
  22. 考拉能丝 ball pen pencil paper new newnew
  23. 茵蒂克丝
  24. red 0 1 2 3 101 1000
  25. blue 4 5 6 7 102 1000
  26. yellow 8 9 10 11 103 1000
  27. white 12 13 14 15 104 1000
  28. 删除一列
  29. >>> del frame4['new']
  30. >>> frame4
  31. 考拉能丝 ball pen pencil paper newnew
  32. 茵蒂克丝
  33. red 0 1 2 3 1000
  34. blue 4 5 6 7 1000
  35. yellow 8 9 10 11 1000
  36. white 12 13 14 15 1000

2.4. 转置

  1. 很强大,把列变成行,行变成列
  2. >>> frame4.T
  3. 茵蒂克丝 red blue yellow white
  4. 考拉能丝
  5. ball 0 4 8 12
  6. pen 1 5 9 13
  7. pencil 2 6 10 14
  8. paper 3 7 11 15
  9. newnew 1000 1000 1000 1000

3. Index对象

3.1. Index的tips

  1. 索引是可以重复的
  2. >>> s = pd.Series(range(6), index = ['white', 'blue', 'white', 'green', 'green', 'orange'])
  3. >>> s
  4. white 0
  5. blue 1
  6. white 2
  7. green 3
  8. green 4
  9. orange 5
  10. dtype: int32
  11. 一个标签对应多个元素,会得到一个Series对象。(DataFrame同理)
  12. >>> s['green']
  13. green 3
  14. green 4
  15. dtype: int32

3.2. Index的一些方法

  1. 返回索引值最大和最小的元素
  2. >>> s.idxmax()
  3. 'orange'
  4. >>> s.idxmin()
  5. 'white'
  6. 判断数据结构中是否存在重复的索引项
  7. >>> s.index.is_unique
  8. False

3.3. 更换索引

  1. 虽然数据结构一旦声明,Index对象不能改变,但是可以通过reindex方法改变索引标签。
  2. >>> s = pd.Series([2,5,7,4], index = ['a', 'b', 'c', 'd'])
  3. >>> s
  4. a 2
  5. b 5
  6. c 7
  7. d 4
  8. dtype: int64
  9. >>> s.reindex(['b', 'a', 'd', 'e'])
  10. b 5.0
  11. a 2.0
  12. d 4.0
  13. e NaN
  14. dtype: float64
  15. 这个例子可以看出,可以更换索引标签的顺序,新的标签会赋值为NaN
  16. 自动完成索引
  17. >>> s = pd.Series([1,5,6,3], index = [0,3,5,6])
  18. >>> s
  19. 0 1
  20. 3 5
  21. 5 6
  22. 6 3
  23. dtype: int64
  24. >>> s.reindex(range(7), method = 'ffill')
  25. 0 1
  26. 1 1
  27. 2 1
  28. 3 5
  29. 4 5
  30. 5 6
  31. 6 3
  32. dtype: int64
  33. >>> s.reindex(range(7), method = 'bfill')
  34. 0 1
  35. 1 5
  36. 2 5
  37. 3 5
  38. 4 6
  39. 5 6
  40. 6 3
  41. dtype: int64
  42. range(7)代表索引的值为0~6method代表填充的方式.
  43. 'ffill'是新插入的索引,其元素为索引编号比它小的那一项的元素,例如索引1就使用索引0的元素,索引2使用索引1的元素。
  44. 'bfill'是新插入的索引,其元素为索引编号比它大的那一项的元素。

3.4. 删除

  1. 使用drop()方法删除。
  2. >>> s
  3. 0 1
  4. 3 5
  5. 5 6
  6. 6 3
  7. dtype: int64
  8. >>> s.drop(3)
  9. 0 1
  10. 5 6
  11. 6 3
  12. dtype: int64
  13. >>> s.drop([0,6])
  14. 3 5
  15. 5 6
  16. dtype: int64
  17. 删除DataFrame中的元素,需要指定元素两个轴的轴标签。
  18. >>> frame = pd.DataFrame(np.arange(16).reshape(4, 4), index = ['red', 'blue', 'yellow', 'white'], columns = ['ball', 'pen', 'pencil', 'paper'])
  19. >>> frame
  20. ball pen pencil paper
  21. red 0 1 2 3
  22. blue 4 5 6 7
  23. yellow 8 9 10 11
  24. white 12 13 14 15
  25. 删除行只需要指明行的标签
  26. >>> frame.drop(['blue', 'white'])
  27. ball pen pencil paper
  28. red 0 1 2 3
  29. yellow 8 9 10 11
  30. 删除列还要指明从哪个轴删除元素。
  31. >>> frame.drop(['pen', 'pencil'], axis = 1)
  32. ball paper
  33. red 0 3
  34. blue 4 7
  35. yellow 8 11
  36. white 12 15

4. DataFrame和Series之间的运算

  1. >>> frame
  2. ball pen pencil paper
  3. red 0 1 2 3
  4. blue 4 5 6 7
  5. yellow 8 9 10 11
  6. white 12 13 14 15
  7. >>> s = pd.Series(np.arange(4), ['ball', 'pen', 'pencil', 'paper'])
  8. 按照frame的列名生成Series
  9. >>> s
  10. ball 0
  11. pen 1
  12. pencil 2
  13. paper 3
  14. dtype: int32
  15. >>> frame - s
  16. ball pen pencil paper
  17. red 0 0 0 0
  18. blue 4 4 4 4
  19. yellow 8 8 8 8
  20. white 12 12 12 12
  21. 一一对应相减
  22. 调整一些s'paper''pencil'的位置
  23. >>> s = pd.Series(np.arange(4), ['ball', 'pen', 'paper', 'pencil'])
  24. >>> frame - s
  25. ball paper pen pencil
  26. red 0 1 0 -1
  27. blue 4 5 4 3
  28. yellow 8 9 8 7
  29. white 12 13 12 11
  30. 发现还是可以一一对应
  31. 新增一列'mug'
  32. >>> s['mug'] = 10
  33. >>> s
  34. ball 0
  35. pen 1
  36. paper 2
  37. pencil 3
  38. mug 10
  39. dtype: int64
  40. >>> frame - s
  41. ball mug paper pen pencil
  42. red 0 NaN 1 0 -1
  43. blue 4 NaN 5 4 3
  44. yellow 8 NaN 9 8 7
  45. white 12 NaN 13 12 11
  46. 发现会增加一列'mug‘但是元素值为NaN

5. 函数运用和映射

5.1. 按行或者列执行操作的函数

  1. >>> frame
  2. ball pen pencil paper
  3. red 0 1 2 3
  4. blue 4 5 6 7
  5. yellow 8 9 10 11
  6. white 12 13 14 15
  7. 返回标量的apply()函数
  8. >>> f = lambda x : x.max() - x.min()
  9. apply()函数在DataFrame对象上调用函数
  10. 默认是对列使用
  11. >>> frame.apply(f)
  12. ball 12
  13. pen 12
  14. pencil 12
  15. paper 12
  16. dtype: int64
  17. 对行使用需要将axis选项设置为1
  18. >>> frame.apply(f, axis = 1)
  19. red 3
  20. blue 3
  21. yellow 3
  22. white 3
  23. dtype: int64
  24. 返回Series对象的apply()函数
  25. >>> def f(x):
  26. ... return pd.Series([x.min(), x.max()], index = ['min', 'max']) (index对应了DataFrameindex)
  27. ...
  28. >>> frame.apply(f)
  29. ball pen pencil paper
  30. min 0 1 2 3
  31. max 12 13 14 15
  32. >>> frame.apply(f, axis = 1)
  33. min max
  34. red 0 3
  35. blue 4 7
  36. yellow 8 11
  37. white 12 15
  38. 我的理解:这里其实就是对每一列都跑一次f函数,对每一列都返回一个函数的值,如果指明axis = 1,就是对每一行都跑一次f函数,对每一行返回一个函数值。

5.2. 统计函数

  1. >>> frame
  2. ball pen pencil paper
  3. red 0 1 2 3
  4. blue 4 5 6 7
  5. yellow 8 9 10 11
  6. white 12 13 14 15
  7. >>> frame.sum()
  8. ball 24
  9. pen 28
  10. pencil 32
  11. paper 36
  12. dtype: int64
  13. >>> frame.mean()
  14. ball 6.0
  15. pen 7.0
  16. pencil 8.0
  17. paper 9.0
  18. dtype: float64
  19. >>> frame.describe()
  20. ball pen pencil paper
  21. count 4.000000 4.000000 4.000000 4.000000 (返回不为NaN的元素个数)
  22. mean 6.000000 7.000000 8.000000 9.000000 (返回平均值)
  23. std 5.163978 5.163978 5.163978 5.163978 (返回标准差)
  24. min 0.000000 1.000000 2.000000 3.000000
  25. 25% 3.000000 4.000000 5.000000 6.000000
  26. 50% 6.000000 7.000000 8.000000 9.000000
  27. 75% 9.000000 10.000000 11.000000 12.000000
  28. max 12.000000 13.000000 14.000000 15.000000 (剩下的都能看懂)

6. 排序函数

6.1. 对Series排序

  1. >>> s = pd.Series([5,0,3,8,4], index = ['red', 'blue', 'yellow', 'white', 'green'])
  2. >>> s
  3. red 5
  4. blue 0
  5. yellow 3
  6. white 8
  7. green 4
  8. dtype: int64
  9. 按照索引名的字典序排序
  10. >>> s.sort_index()
  11. blue 0
  12. green 4
  13. red 5
  14. white 8
  15. yellow 3
  16. dtype: int64
  17. >>> s.sort_index(ascending=False) (降序)
  18. yellow 3
  19. white 8
  20. red 5
  21. green 4
  22. blue 0
  23. dtype: int64
  24. 按照值进行排序
  25. >>> s.sort_values()
  26. blue 0
  27. yellow 3
  28. green 4
  29. red 5
  30. white 8
  31. dtype: int64
  32. >>> s.sort_values(ascending=False)
  33. white 8
  34. red 5
  35. green 4
  36. yellow 3
  37. blue 0
  38. dtype: int64
  39. 书上写的是s.order(),但是自己实现起来出现错误,上网找了是sort_values()方法。
  40. 排位次操作(按照元素的值排位)
  41. >>> s.rank()
  42. red 4.0
  43. blue 1.0
  44. yellow 2.0
  45. white 5.0
  46. green 3.0
  47. dtype: float64
  48. >>> s.rank(ascending=False)
  49. red 2.0
  50. blue 5.0
  51. yellow 4.0
  52. white 1.0
  53. green 3.0
  54. dtype: float64

6.2. 对DataFrame排序

  1. >>> frame
  2. ball pen pencil paper
  3. red 0 1 2 3
  4. blue 4 5 6 7
  5. yellow 8 9 10 11
  6. white 12 13 14 15
  7. 按照索引和列名排序
  8. >>> frame.sort_index()
  9. ball pen pencil paper
  10. blue 4 5 6 7
  11. red 0 1 2 3
  12. white 12 13 14 15
  13. yellow 8 9 10 11
  14. >>> frame.sort_index(axis=1)
  15. ball paper pen pencil
  16. red 0 3 1 2
  17. blue 4 7 5 6
  18. yellow 8 11 9 10
  19. white 12 15 13 14
  20. 注意这里都是对索引标签和对列名进行排序的,而不是按元素大小
  21. 按照值排序
  22. 按照列进行排序
  23. >>> frame.sort_values(by='pen')
  24. ball pen pencil paper
  25. red 0 1 2 3
  26. blue 4 5 6 7
  27. yellow 8 9 10 11
  28. white 12 13 14 15
  29. 按照行进行排序
  30. >>> frame.sort_values(by='blue', axis = 1)
  31. ball pen pencil paper
  32. red 0 1 2 3
  33. blue 4 5 6 7
  34. yellow 8 9 10 11
  35. white 12 13 14 15
  36. 这里书上应该是版本过旧,写的是sort_index()而不是sort_values()

7. 相关性和协方差

概念

相关性(correlation)

指两个变量之间的关系(或依赖关系)。

线性相关是指两个变量之间的直接关系。

相关性可以在-1(完全负相关)和+1(完美正相关)之间,0表示无线性关系。

协方差(covariance)

从直观上来看,协方差表示的是两个变量总体误差的期望。

如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值时另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值;如果两个变量的变化趋势相反,即其中一个变量大于自身的期望值时另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。

二者关系

\[r_{ξ,η} = \frac{Cov(ξ,η)}{\sqrt{Dξ}\sqrt{Dη}}
\]

其中r为相关性,Cov为协方差。

知乎上的解释

相关性和协方差的解释

  1. >>> frame
  2. ball pen pencil paper
  3. red 0 1 2 3
  4. blue 4 5 6 7
  5. yellow 8 9 10 11
  6. white 12 13 14 15
  7. cov()和corr()计算协方差和相关系数
  8. 这个是书上写的,并不是很懂意义
  9. >>> frame.corr()
  10. ball pen pencil paper
  11. ball 1.0 1.0 1.0 1.0
  12. pen 1.0 1.0 1.0 1.0
  13. pencil 1.0 1.0 1.0 1.0
  14. paper 1.0 1.0 1.0 1.0
  15. >>> frame.cov()
  16. ball pen pencil paper
  17. ball 26.666667 26.666667 26.666667 26.666667
  18. pen 26.666667 26.666667 26.666667 26.666667
  19. pencil 26.666667 26.666667 26.666667 26.666667
  20. paper 26.666667 26.666667 26.666667 26.666667
  21. 计算某列和某列的相关系数和协方差:
  22. >>> frame.ball.corr(frame.pen)
  23. 1.0
  24. >>> frame.pen.cov(frame.ball)
  25. 26.666666666666664
  26. corrwith()计算DataFrame的列(axis=0,默认)或行(axis=1)跟另外一个SeriesDataFrame之间的相关系数
  27. >>> frame.corrwith(frame.pen)
  28. ball 1.0
  29. pen 1.0
  30. pencil 1.0
  31. paper 1.0
  32. dtype: float64
  33. >>> frame.corrwith(frame.ix[0], axis = 1)
  34. red 1.0
  35. blue 1.0
  36. yellow 1.0
  37. white 1.0
  38. dtype: float64

8. NaN数据

8.1. 为元素赋值NaN

  1. 使用np.NaN
  2. >>> s = pd.Series([0,1,2,np.NaN,9], index = ['red', 'blue', 'yellow', 'white', 'green'])
  3. >>> s
  4. red 0.0
  5. blue 1.0
  6. yellow 2.0
  7. white NaN
  8. green 9.0
  9. dtype: float64
  10. >>> s['white']
  11. nan

8.2. 过滤NaN

  1. 删除Series中的NaN
  2. 使用dropna()函数或者使用notnull()筛选
  3. >>> s.dropna()
  4. red 0.0
  5. blue 1.0
  6. yellow 2.0
  7. green 9.0
  8. dtype: float64
  9. >>> s[s.notnull()]
  10. red 0.0
  11. blue 1.0
  12. yellow 2.0
  13. green 9.0
  14. dtype: float64
  15. 删除DataFrame中的NaN
  16. >>> frame = pd.DataFrame([[6, np.NaN, 6], [np.NaN, np.NaN, np.NaN], [2, np.NaN, 5]], index = ['blue', 'green', 'red'], columns = ['ball', 'mug', 'pen'])
  17. >>> frame
  18. ball mug pen
  19. blue 6.0 NaN 6.0
  20. green NaN NaN NaN
  21. red 2.0 NaN 5.0
  22. 使用dropna()只要行或列有一个NaN,该行或列就会被删除
  23. >>> frame.dropna()
  24. Empty DataFrame
  25. Columns: [ball, mug, pen]
  26. Index: []
  27. 可以发现因为每一行都有NaN,因此把每一行都删除了
  28. how指定值为'all',告知dropna()函数只删除所有元素均为NaN的行货列
  29. >>> frame.dropna(how='all')
  30. ball mug pen
  31. blue 6.0 NaN 6.0
  32. red 2.0 NaN 5.0
  33. >>> frame.dropna(how='all', axis = 1)
  34. ball pen
  35. blue 6.0 6.0
  36. green NaN NaN
  37. red 2.0 5.0

8.3. 为NaN元素填充其他值

  1. >>> frame
  2. ball mug pen
  3. blue 6.0 NaN 6.0
  4. green NaN NaN NaN
  5. red 2.0 NaN 5.0
  6. 对所有NaN都填充0
  7. >>> frame.fillna(0)
  8. ball mug pen
  9. blue 6.0 0.0 6.0
  10. green 0.0 0.0 0.0
  11. red 2.0 0.0 5.0
  12. 指定列填充元素
  13. >>> frame.fillna({'ball':1, 'mug':10, 'pen':0})
  14. ball mug pen
  15. blue 6.0 10.0 6.0
  16. green 1.0 10.0 0.0
  17. red 2.0 10.0 5.0
  18. 貌似无法指定行填充元素,如果有错请务必告诉我
  19. >>> frame.fillna({'blue':1, 'green':100, 'red':0}, axis = 1)
  20. Traceback (most recent call last):
  21. File "<stdin>", line 1, in <module>
  22. File "E:\Python\Python3\lib\site-packages\pandas\core\frame.py", line 2754, in fillna
  23. downcast=downcast, **kwargs)
  24. File "E:\Python\Python3\lib\site-packages\pandas\core\generic.py", line 3639, in fillna
  25. raise NotImplementedError('Currently only can fill '
  26. NotImplementedError: Currently only can fill with dict/Series column by column
  27. >>> frame.fillna({'blue':1, 'green':100, 'red':0})
  28. ball mug pen
  29. blue 6.0 NaN 6.0
  30. green NaN NaN NaN
  31. red 2.0 NaN 5.0

9. 等级索引和分级

  1. 多级索引
  2. >>> s = pd.Series(np.random.rand(8), index = [['white', 'white', 'white', 'blue', 'blue', 'red', 'blue', 'red'], ['up', 'down', 'right', 'up', 'down', 'up', 'left', 'left']])
  3. >>> s
  4. white up 0.683135
  5. down 0.206419
  6. right 0.616636
  7. blue up 0.010939
  8. down 0.419153
  9. red up 0.632491
  10. blue left 0.060663
  11. red left 0.713318
  12. dtype: float64
  13. >>> s.index
  14. MultiIndex(levels=[['blue', 'red', 'white'], ['down', 'left', 'right', 'up']],
  15. labels=[[2, 2, 2, 0, 0, 1, 0, 1], [3, 0, 2, 3, 0, 3, 1, 1]])
  16. 指明第一列索引
  17. >>> s['blue']
  18. up 0.010939
  19. down 0.419153
  20. left 0.060663
  21. dtype: float64
  22. 指明第二列索引要类似切片用[:,第二列名],直接用[第二列名]会报错
  23. >>> s[:,'up']
  24. white 0.683135
  25. blue 0.010939
  26. red 0.632491
  27. dtype: float64
  28. >>> s['white','up']
  29. 0.68313456001550599
  30. 使用unstack()将使用等级索引的Series对象转换为一个DataFrame对象,把第二列索引转换为相应的列
  31. >>> s.unstack()
  32. down left right up
  33. blue 0.419153 0.060663 NaN 0.010939
  34. red NaN 0.713318 NaN 0.632491
  35. white 0.206419 NaN 0.616636 0.683135
  36. 逆操作,使用stack()将DataFrame对象转换为Series对象,列名为第二列索引
  37. >>> frame
  38. ball mug pen
  39. blue 6.0 NaN 6.0
  40. green NaN NaN NaN
  41. red 2.0 NaN 5.0
  42. >>> frame.stack()
  43. blue ball 6.0
  44. pen 6.0
  45. red ball 2.0
  46. pen 5.0
  47. dtype: float64
  48. DataFrame,为行和列都定义等级索引。
  49. >>> frame1 = pd.DataFrame(np.random.rand(16).reshape(4, 4), index = [['white', 'white', 'red', 'red'], ['up', 'down', 'up', 'down']], columns = [['pen', 'pen', 'paper', 'paper'], [1, 2, 1, 2]])
  50. >>> frame1
  51. pen paper
  52. 1 2 1 2
  53. white up 0.461711 0.907535 0.720078 0.706302
  54. down 0.105371 0.673227 0.118255 0.401674
  55. red up 0.339669 0.307175 0.831875 0.699694
  56. down 0.946733 0.014064 0.716693 0.243006

9.1. 重新调整顺序和为层级排序

  1. >>> frame1.columns.names = ['objects', 'id']
  2. >>> frame1.index.names = ['colors', 'status']
  3. >>> frame1
  4. objects pen paper
  5. id 1 2 1 2
  6. colors status
  7. white up 0.461711 0.907535 0.720078 0.706302
  8. down 0.105371 0.673227 0.118255 0.401674
  9. red up 0.339669 0.307175 0.831875 0.699694
  10. down 0.946733 0.014064 0.716693 0.243006
  11. 交换层级
  12. >>> frame1.swaplevel('colors', 'status')
  13. objects pen paper
  14. id 1 2 1 2
  15. status colors
  16. up white 0.461711 0.907535 0.720078 0.706302
  17. down white 0.105371 0.673227 0.118255 0.401674
  18. up red 0.339669 0.307175 0.831875 0.699694
  19. down red 0.946733 0.014064 0.716693 0.243006
  20. 对某个层级的数据排序
  21. 书上用sortlevel()方法,应该还是旧版本原因
  22. 文档用的是sort_index()方法
  23. >>> frame1.sort_index(level = 'colors')
  24. objects pen paper
  25. id 1 2 1 2
  26. colors status
  27. red down 0.946733 0.014064 0.716693 0.243006
  28. up 0.339669 0.307175 0.831875 0.699694
  29. white down 0.105371 0.673227 0.118255 0.401674
  30. up 0.461711 0.907535 0.720078 0.706302
  31. >>> frame1.sort_index(level = 'objects', axis = 1)
  32. objects paper pen
  33. id 1 2 1 2
  34. colors status
  35. white up 0.720078 0.706302 0.461711 0.907535
  36. down 0.118255 0.401674 0.105371 0.673227
  37. red up 0.831875 0.699694 0.339669 0.307175
  38. down 0

9.2. 按层级统计数据

  1. 对指定的层级进行统计
  2. >>> frame1.sum(level='status')
  3. objects pen paper
  4. id 1 2 1 2
  5. status
  6. down 1.052105 0.687291 0.834948 0.644681
  7. up 0.801380 1.214710 1.551954 1.405997
  8. >>> frame1.sum(level='id', axis=1)
  9. id 1 2
  10. colors status
  11. white up 1.181789 1.613837
  12. down 0.223626 1.074902
  13. red up 1.171545 1.006870
  14. down 1.663426 0.257070

Python之Pandas库学习(一):简介的更多相关文章

  1. Python之Pandas库学习(二):数据读写

    1. I/O API工具 读取函数 写入函数 read_csv to_csv read_excel to_excel read_hdf to_hdf read_sql to_sql read_json ...

  2. python的pandas库学习笔记

    导入: import pandas as pd from pandas import Series,DataFrame 1.两个主要数据结构:Series和DataFrame (1)Series是一种 ...

  3. Python之Pandas库学习(三):数据处理

    1. 合并 可以将其理解为SQL中的JOIN操作,使用一个或多个键把多行数据结合在一起. 1.1. 简单合并 参数on表示合并依据的列,参数how表示用什么方式操作(默认是内连接). >> ...

  4. Python之Pandas库常用函数大全(含注释)

    前言:本博文摘抄自中国慕课大学上的课程<Python数据分析与展示>,推荐刚入门的同学去学习,这是非常好的入门视频. 继续一个新的库,Pandas库.Pandas库围绕Series类型和D ...

  5. pandas库学习笔记(二)DataFrame入门学习

    Pandas基本介绍——DataFrame入门学习 前篇文章中,小生初步介绍pandas库中的Series结构的创建与运算,今天小生继续“死磕自己”为大家介绍pandas库的另一种最为常见的数据结构D ...

  6. python爬虫解析库学习

    一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...

  7. Python数据分析Pandas库方法简介

    Pandas 入门 Pandas简介 背景:pandas是一个Python包,提供快速,灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观.它旨在成为在Python中进行实际, ...

  8. Python html.parser库学习小结

    分类路径:/Datazen/DataMining/Crawler/   前段时间,一朋友让我做个小脚本,抓一下某C2C商城上竞争对手的销售/价格数据,好让他可以实时调整自己的营销策略.自己之前也有过写 ...

  9. Python之matplotlib库学习

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...

随机推荐

  1. Altera公司高速PCB布线指南

    来至Altera公司的高速PCB布线指南,该文档言简意赅,深入浅出,对于日常高速PCB布局布线中经常碰到的一些问题进行了解析.例如:板材的选择,介电常数及损耗因子对高速高频线路的影响,传输线,阻抗控制 ...

  2. 日志文件 清理or压缩

    1.操作前请断开所有数据库连接. 2.分离数据库 分离数据库:企业管理器->服务器->数据库->cwbase1->右键->分离数据库 分离后,cwbase1数据库被删除, ...

  3. JS 密码弱中强显示

    <!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" conten ...

  4. js div的显示和隐藏

    <head>    <title></title>    <style type="text/css">        div    ...

  5. 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机

    原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...

  6. Gradle离线配置

    原文:Gradle离线配置 1. 先在Gradle官网下载最新的离线zip压缩包. https://gradle.org/ 2. 将下载的zip压缩包,保存到本地磁盘下的目录中. 3. 修改(grad ...

  7. 从PRISM开始学WPF(八)导航Navigation?

    原文:从PRISM开始学WPF(八)导航Navigation? 0x6Navigation Basic Navigation Prism中的Navigation提供了一种类似导航的功能,他可以根据用户 ...

  8. Win10《芒果TV》商店版更新v3.2.6:修复后台任务故障,优化推送频次

    2017湖南卫视大型音乐竞技节目<歌手>,2017年1月21日晚首播第一期,7位歌手惊艳亮嗓,<芒果TV>UWP版迅速更新v3.2.6版,主要是修复后台任务故障,优化推送频次, ...

  9. 处理 Windows Phone 应用中的“后退”按钮 (XAML)

    与电脑不同,所有 Windows Phone 设备都有“后退”按钮,它允许用户在应用的页面之间向后导航.如果用户在转到应用的第一页时再次按“后退”按钮,操作系统会挂起你的应用并将用户导航到应用启动前的 ...

  10. mysql启动脚本

    一台服务器上安装多个MySQL实例之后,实例的启动关闭不能再用service mysqld start/stop/restart命令,所以编写如下脚本用于启动关闭对应端口的实例. 这个脚本适用于多实例 ...