趣学Python数据分析:轴和索引

上一篇总结了Python数据处理包Pandas的DataFrame,介绍了Axes相关的属性和方法。文章的图形展示效果不是很友好,再换一种形式。


同时继续总结,数据框的访问相关的属性和方法。


01

轴(Axes) 相关

构造一个数据框

 
 
  1. In [1]: import datetime as dt


  2. In [3]: import pandas as pd


  3. In [4]: df = pd.DataFrame([[1,'gz',dt.date(2019,4,13)],[3,'lg',dt.date(2019,4,14

  4.    ...: )],[5,'jh',dt.date(2019,4,15)]])


  5. In [5]: df

  6. Out[5]: 

  7. 0 1 2

  8. 0 1 gz 2019-04-13

  9. 1 3 lg 2019-04-14

  10. 2 5 jh 2019-04-15

行、列索引

 
 
  1. In [6]: df.index  # 展示行索引

  2. Out[6]: RangeIndex(start=0, stop=3, step=1)


  3. In [7]: df.columns  # 展示列索引

  4. Out[7]: RangeIndex(start=0, stop=3, step=1)


  5. In [8]: df.columns=['id','nickname','register'] # 为列索引重新赋值


  6. In [9]: df

  7. Out[9]: 

  8. id nickname register

  9. 0 1 gz 2019-04-13

  10. 1 3 lg 2019-04-14

  11. 2 5 jh 2019-04-15


  12. In [10]: df.index=['p1','p2','p3'] # 为行索引重新赋值


  13. In [11]: df

  14. Out[11]: 

  15. id nickname register

  16. p1 1 gz 2019-04-13

  17. p2 3 lg 2019-04-14

  18. p3 5 jh 2019-04-15

行、列索引的类型,统计及筛选

 
 
  1. In [12]: df.dtypes  # 展示每列的数据类型

  2. Out[12]: 

  3. id int64

  4. nickname object

  5. register object

  6. dtype: object


  7. In [13]: df.ftypes   # 展示每列为稠密(dense)或者稀疏(sparse)

  8. Out[13]: 

  9. id           int64:dense

  10. nickname    object:dense

  11. register    object:dense

  12. dtype: object


  13. In [14]: df.get_dtype_counts()  # 统计列类型

  14. Out[14]: 

  15. int64 1

  16. object 2

  17. dtype: int64


  18. In [15]: df.select_dtypes(include=['int']) # 根据列类型(如为int,或者object)筛选数据

  19. Out[15]: 

  20. id

  21. p1 1

  22. p2 3

  23. p3 5

整个数据框相关,沿着两个轴的数据统计

 
 
  1. In [16]: df.values  # 返回NumPy数据对象

  2. Out[16]: 

  3. array([[1, 'gz', datetime.date(2019, 4, 13)],

  4. [3, 'lg', datetime.date(2019, 4, 14)],

  5. [5, 'jh', datetime.date(2019, 4, 15)]], dtype=object)


  6. In [17]: df.get_values()  # 稀疏值转稠密后,返回NumPy数据对象

  7. Out[17]: 

  8. array([[1, 'gz', datetime.date(2019, 4, 13)],

  9. [3, 'lg', datetime.date(2019, 4, 14)],

  10. [5, 'jh', datetime.date(2019, 4, 15)]], dtype=object)


  11. In [18]: df.axes

  12. Out[18]: 

  13. [Index(['p1', 'p2', 'p3'], dtype='object'),

  14. Index(['id', 'nickname', 'register'], dtype='object')]


  15. In [19]: df.size

  16. Out[19]: 9


  17. In [20]: df.ndim

  18. Out[20]: 2


  19. In [21]: df.shape

  20. Out[21]: (3, 3)

创建稠密列、稀疏列,查看类型,比较存储占用的空间

 
 
  1. In [22]: df.loc[:,'gender']=['Male',None,None] # 稠密列


  2. In [23]: df

  3. Out[23]: 

  4. id nickname register gender

  5. p1 1 gz 2019-04-13 Male

  6. p2 3 lg 2019-04-14 None

  7. p3 5 jh 2019-04-15 None


  8. In [24]: dfspa = df.copy()                                                      


  9. In [25]: dfspa

  10. Out[25]: 

  11. id nickname register gender

  12. p1 1 gz 2019-04-13 Male

  13. p2 3 lg 2019-04-14 None

  14. p3 5 jh 2019-04-15 None


  15. In [27]: dfspa.loc[:,'gender']=pd.SparseArray(['Male',None,None]) # 稀疏列


  16. In [28]: dfspa

  17. Out[28]: 

  18. id nickname register gender

  19. p1 1 gz 2019-04-13 Male

  20. p2 3 lg 2019-04-14 NaN

  21. p3 5 jh 2019-04-15 NaN


  22. In [30]: dfspa.dtypes        # 查看稀疏列的类型

  23. Out[30]: 

  24. id int64

  25. nickname object

  26. register object

  27. gender Sparse[object, nan]

  28. dtype: object


  29. In [31]: df.dtypes

  30. Out[31]: 

  31. id int64

  32. nickname object

  33. register object

  34. gender object

  35. dtype: object


  36. In [32]: df.memory_usage()                                                      

  37. Out[32]: 

  38. Index 24

  39. id 24

  40. nickname 24

  41. register 24

  42. gender 24

  43. dtype: int64


  44. In [33]: dfspa.memory_usage()  # 稀疏列更加节省内存空间

  45. Out[33]: 

  46. Index 104

  47. id 24

  48. nickname 24

  49. register 24

  50. gender 12

  51. dtype: int64

判断数据框是否为空

 
 
  1. In [35]: df.empty

  2. Out[35]: False


  3. In [41]: dfemp = pd.DataFrame([])

  4. In [42]: dfemp

  5. Out[42]: 

  6. Empty DataFrame

  7. Columns: []

  8. Index: []


  9. In [43]: dfemp.empty

  10. Out[43]: True


  11. In [44]: dfemp = pd.DataFrame([[]],index=['a','b'])

  12. In [45]: dfemp

  13. Out[45]: 

  14. Empty DataFrame

  15. Columns: []

  16. Index: [a, b]


02

索引(Indexing) 相关

get访问


 
 
  1. In [47]: df                                                                     

  2. Out[47]: 

  3. id nickname register gender

  4. p1 1 gz 2019-04-13 Male

  5. p2 3 lg 2019-04-14 None

  6. p3 5 jh 2019-04-15 None


  7. In [48]: df.get('id')

  8. Out[48]: 

  9. p1 1

  10. p2 3

  11. p3 5

  12. Name: id, dtype: int64


  13. In [53]: df.get('id').get('p2')

  14. Out[53]: 3

  15. In [54]: type(df.get('id').get('p2'))

  16. Out[54]: numpy.int64


  17. In [56]: df.get('id').get('p22') # 如果key不存在,返回默认值None

  18. In [62]: df.get('id').get('p22')==None # 验证

  19. Out[62]: True

item 返回原生Python对象

 
 
  1. In [52]: df.get('id').get('p2').item() # item返回Python原生对象

  2. Out[52]: 3

  3. In [55]: type(df.get('id').get('p2').item()) # 验证

  4. Out[55]: int

at , iat 访问单个值

 
 
  1. In [63]: df                                                                     

  2. Out[63]: 

  3. id nickname register gender

  4. p1 1 gz 2019-04-13 Male

  5. p2 3 lg 2019-04-14 None

  6. p3 5 jh 2019-04-15 None


  7. In [64]: df.at['p3','register'] # at 通过行、列标签访问

  8. Out[64]: datetime.date(2019, 4, 15)


  9. In [65]: df['nickname'].at['p2']

  10. Out[65]: 'lg'


  11. # 如果访问的key不存在,抛出KeyError错误


  12. In [68]: df.iat[1,3] # 通过整数索引访问,像matlab那样访问数据


  13. In [69]: df.iat[0,1]

  14. Out[69]: 'gz'


  15. In [70]: df.iat[2,2]

  16. Out[70]: datetime.date(2019, 4, 15)

loc, iloc 访问整行、整列

 
 
  1. In [71]: df                                                                     

  2. Out[71]: 

  3. id nickname register gender

  4. p1 1 gz 2019-04-13 Male

  5. p2 3 lg 2019-04-14 None

  6. p3 5 jh 2019-04-15 None


  7. In [72]: df.loc['p3','nickname'] # 此种访问建议走at访问模式

  8. Out[72]: 'jh'


  9. In [73]: df.loc['p2'] # 行标签访问整行

  10. Out[73]: 

  11. id 3

  12. nickname lg

  13. register 2019-04-14

  14. gender None

  15. Name: p2, dtype: object


  16. In [74]: df.loc['nickname'] # 报错!


  17. In [75]: df.loc[:,'nickname']

  18. Out[75]: 

  19. p1 gz

  20. p2 lg

  21. p3 jh

  22. Name: nickname, dtype: object


  23. In [76]: df.iloc[2] # 访问行整数索引为2的行

  24. Out[76]: 

  25. id 5

  26. nickname jh

  27. register 2019-04-15

  28. gender None

  29. Name: p3, dtype: object


  30. In [77]: df.iloc[:,3] # 访问列整数索引为3的列

  31. Out[77]: 

  32. p1 Male

  33. p2 None

  34. p3 None

  35. Name: gender, dtype: object


03

好书每周送


它是Python数据分析领域最畅销的一本书,定价119元。这么一本含金量高的书,能免费包邮到家吗? 能!并且,大家如果参与度高,我们每周都至少送1本。


感谢机械工业出版社的大力支持!


640?wx_fmt=png


640?wx_fmt=png

购买链接


在看或分享,留言:day几打卡+今日生活有何感悟。每周会从参与度最高的小伙伴中选出。



推荐阅读:

4 个Python数据读取的常见错误

头条、阿里、快手、百度面试实录


640?wx_fmt=jpeg

Python数据与机器学习

致力于做最有态度、走心的原创公众号

长按二维码订阅


smiley_66.png给个好看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值