Series的层级索引

二层索引

  1. import pandas as pd
  2. import numpy as np
  3. ser = pd.Series(np.random.randn(6), index=[['a', 'a', 'b', 'b', 'c', 'c'],
  4. [0, 1, 2, 0, 1, 2]])
  5. print(ser)
  6. '''
  7. a 0 -0.286195
  8. 1 -0.462873
  9. b 2 -0.697002
  10. 0 -0.354256
  11. c 1 0.704155
  12. 2 -0.343872
  13. dtype: float64
  14. '''
  15. print(type(ser.index))
  16. # <class 'pandas.core.indexes.multi.MultiIndex'>
  17. # 外层选取
  18. print(ser['c'])
  19. '''
  20. 1 0.110106
  21. 2 0.000338
  22. dtype: float64
  23. '''
  24. # 内层选取
  25. print(ser[:, 2])
  26. '''
  27. b 0.505124
  28. c 1.036544
  29. dtype: float64
  30. '''

常用函数

  1. import pandas as pd
  2. import numpy as np
  3. ser = pd.Series(np.random.randn(6), index=[['a', 'a', 'b', 'b', 'c', 'c'],
  4. [0, 1, 2, 0, 1, 2]])
  5. print(ser)
  6. '''
  7. a 0 0.664090
  8. 1 0.356893
  9. b 2 2.551393
  10. 0 0.674561
  11. c 1 1.029411
  12. 2 -0.492202
  13. dtype: float64
  14. '''
  15. print(ser.index.levels) # [['a', 'b', 'c'], [0, 1, 2]]
  16. # swapleveal():交换内层和外层索引
  17. print(ser.swaplevel())
  18. '''
  19. 0 a 0.664090
  20. 1 a 0.356893
  21. 2 b 2.551393
  22. 0 b 0.674561
  23. 1 c 1.029411
  24. 2 c -0.492202
  25. dtype: float64
  26. '''
  27. # unstack():将具有多层索引的Series转化为DataFrame,参数可以指定处理的层索引
  28. print(ser.unstack())
  29. '''
  30. 0 1 2
  31. a -2.094717 0.593266 NaN
  32. b -0.006563 NaN -3.098567
  33. c NaN -0.790008 -0.603009
  34. '''
  35. ---------------------
  36. print(ser.unstack(0))
  37. '''
  38. a b c
  39. 0 -2.094717 -0.006563 NaN
  40. 1 0.593266 NaN -0.790008
  41. 2 NaN -3.098567 -0.603009
  42. '''
  43. # stack(): 将DataFrame转化为具有多层索引的Series,参数可以指定处理的层索引
  44. print(ser.unstack(0).stack())
  45. '''
  46. 0 a -1.176036
  47. b 0.916851
  48. 1 a -0.280411
  49. c 0.015331
  50. 2 b -0.962107
  51. c 1.050720
  52. dtype: float64
  53. '''

统计计算

image.png

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame(np.random.randn(4, 3), columns=['a', 'b', 'c'])
  4. df.loc[0, 'a'] = np.nan
  5. print(df)
  6. '''
  7. a b c
  8. 0 NaN -0.351020 -0.082929
  9. 1 -0.227825 -2.144045 1.403983
  10. 2 -0.491475 0.729788 2.318608
  11. 3 -0.693459 0.006438 1.203519
  12. '''
  13. print(df.min())
  14. '''
  15. a -0.693459
  16. b -2.144045
  17. c -0.082929
  18. dtype: float64
  19. '''
  20. print(df.min(skipna=False))
  21. '''
  22. a NaN
  23. b -2.144045
  24. c -0.082929
  25. dtype: float64
  26. '''

分组与聚合

基本概念

  • 在划分出来的组上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换、过滤,这个过程主要包含以下三步:
    • 拆分(Spliting):对数据进行分组
    • 应用(Applying):对分组数据应用聚合函数,进行相应计算
    • 合并(Combining):汇总计算结果
  • groupby的过程就是将原有的DataFrame按照groupby的字段,划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame,而之后的一系列操作(比如agg、apply等),均是基于子DataFrame的操作

image.png

分组

分组对象包括 DataFrameGroupBy 和 SeriesGroupBy

分组操作

没有进行实际运算,只是包含分组的中间数据

  1. import pandas as pd
  2. import numpy as np
  3. var = {'key1': ['a', 'b', 'a', 'b'],
  4. 'key2': ['one', 'one', 'two', 'two'],
  5. 'data1': np.random.randn(4),
  6. 'data2': np.random.randn(4)}
  7. df = pd.DataFrame(var)
  8. print(df)
  9. '''
  10. key1 key2 data1 data2
  11. 0 a one -0.521521 -1.497652
  12. 1 b one 0.671180 -1.394252
  13. 2 a two -0.884387 -0.006109
  14. 3 b two -0.047436 -0.876259
  15. '''
  16. print(type(df.groupby('key1')))
  17. # <class 'pandas.core.groupby.generic.DataFrameGroupBy'>
  18. print(type(df['data1'].groupby(df['key1'])))
  19. # <class 'pandas.core.groupby.generic.SeriesGroupBy'>

分组运算

对group对象进行分组运算,非数值数据不进行分组运算

  1. # size()返回每个分组的元素个数
  2. print(df.groupby('key1').size())
  3. '''
  4. key1
  5. a 2
  6. b 2
  7. dtype: int64
  8. '''
  9. print(df.groupby(['key1', 'key2']).size())
  10. '''
  11. key1 key2
  12. a one 1
  13. two 1
  14. b one 1
  15. two 1
  16. dtype: int64
  17. '''
  18. print(df['data1'].groupby(df['key1']).size())
  19. '''
  20. key1
  21. a 2
  22. b 2
  23. Name: data1, dtype: int64
  24. '''

聚合

内置的聚合函数

sum()、mean()、max()、min()、count()、size()、describe()等
image.png

自定义函数,传入agg方法中

  1. import pandas as pd
  2. import numpy as np
  3. var = {'key1': ['a', 'b', 'a', 'b'],
  4. 'key2': ['one', 'one', 'two', 'two'],
  5. 'data1': np.random.randn(4),
  6. 'data2': np.random.randn(4)}
  7. df = pd.DataFrame(var)
  8. print(df)
  9. '''
  10. key1 key2 data1 data2
  11. 0 a one -0.347282 0.826907
  12. 1 b one -0.387571 1.319850
  13. 2 a two -0.659646 0.543489
  14. 3 b two 0.899404 0.508680
  15. '''
  16. def peak_range(g):
  17. return g.max() - g.min()
  18. print(df.groupby('key1').agg(peak_range))
  19. print(df.groupby('key1').agg(lambda g: g.max() - g.min()))
  20. '''
  21. data1 data2
  22. key1
  23. a 0.312364 0.283418
  24. b 1.286975 0.811170
  25. '''

使用多个聚合函数

  1. def peak_range(g):
  2. return g.max() - g.min()
  3. print(df.groupby('key1').agg(['mean', 'count', peak_range]))
  4. '''
  5. data1 data2
  6. mean count peak_range mean count peak_range
  7. key1
  8. a -0.411191 2 0.204956 -0.396638 2 1.254341
  9. b -1.417198 2 0.579441 -1.376166 2 1.557887
  10. '''
  11. # 通过元组提供新的列名
  12. print(df.groupby('key1').agg(['mean', 'count', ('range', peak_range)]))
  13. '''
  14. data1 data2
  15. mean count range mean count range
  16. key1
  17. a -0.411191 2 0.204956 -0.396638 2 1.254341
  18. b -1.417198 2 0.579441 -1.376166 2 1.557887
  19. '''

对不同的列使用不同的聚合函数

使用dict

  1. print(df.groupby('key1').agg({'data1': 'mean', 'data2': 'sum'}))
  2. '''
  3. data1 data2
  4. key1
  5. a -0.624912 1.954829
  6. b 1.062752 -1.502316
  7. '''
  8. print(df.groupby('key1').agg({'data1': ['mean', 'max'], 'data2': 'sum'}))
  9. '''
  10. data1 data2
  11. mean max sum
  12. key1
  13. a -0.624912 -0.446746 1.954829
  14. b 1.062752 2.126030 -1.502316
  15. '''