pandas快速入门

numpy之后让我们紧接着学习pandas。Pandas最初被作为金融数据分析工具而开发出来,后来因为其强大性以及友好性,在数据分析领域被广泛使用,下面让我们一窥究竟。

本文参考官网给出的10 Minutes to pandas

对象创建

创建Series

  1. #创建Series对象,index参数可省,默认为0~n-1的数字索引
  2. #与numpy中的array一样,统一Series要求数据类型一致,这样可以加快处理速度
  3. In [12]: s = pd.Series([1,2,3,np.nan,5,7],index=list('ABCDEF'))
  4. In [13]: s
  5. Out[13]:
  6. A 1.0
  7. B 2.0
  8. C 3.0
  9. D NaN
  10. E 5.0
  11. F 7.0
  12. dtype: float64

创建dataFrame

1.使用numpy array创建

  1. In [4]: dates = pd.date_range('20170909',periods=6) #pandas对于时间的处理也很出色
  2. In [5]: dates
  3. Out[5]:
  4. DatetimeIndex(['2017-09-09', '2017-09-10', '2017-09-11', '2017-09-12',
  5. '2017-09-13', '2017-09-14'],
  6. dtype='datetime64[ns]', freq='D')
  7. In [6]: df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
  8. ...: #pd.DataFrame(数组, 行索引(可省), 列索引一般不省略)
  9. In [7]: df
  10. Out[7]:
  11. A B C D
  12. 2017-09-09 -0.874363 -0.682658 0.533449 -0.396235
  13. 2017-09-10 0.878331 0.825946 1.075934 -0.820331
  14. 2017-09-11 0.720920 0.095851 -1.521827 1.252951
  15. 2017-09-12 -1.338117 0.787224 0.450896 0.586154
  16. 2017-09-13 0.954178 -0.475164 0.356891 -1.428600
  17. 2017-09-14 1.081780 0.846195 -0.070906 -0.805635

2.使用字典创建

  1. df2 = pd.DataFrame({ 'A':[1,2,3],
  2. 'B':[3,4,5],
  3. 'C':np.arange(3)
  4. })
  5. print df2
  6. A B C
  7. 0 1 3 0
  8. 1 2 4 1
  9. 2 3 5 2

网上使用多种数据类型也是可以的,博主认为同种类型更加常用一点吧

查看数据类型与numpy一样,是

df.dtypes

完成创建后,列将作为df的属性,可以通过df.A直接访问列

查看数据

查看数据就需要数据,博主这里使用的数据样例是之前爬取的中国城市历史天气

  1. In [41]: df = pd.read_csv('./weather.csv')
  2. In [42]: df.head(10) #这里取前10条记录,默认为5条
  3. Out[42]:
  4. city pinYin rainy cloudy sunny overcast snowy
  5. 0 阿城 acheng 563 761 809 8 215
  6. 1 昂昂溪区 angangxiqu 158 474 213 28 29
  7. 2 爱民区 aiminqu 269 304 253 17 72
  8. 3 安达 anda 523 977 700 0 169
  9. 4 安图 antu 580 868 704 2 219
  10. 5 鞍山 anshan 504 736 988 3 133
  11. 6 阿鲁旗 aluqi 445 821 935 54 120
  12. 7 敖汉 aohan 462 821 928 48 109
  13. 8 阿巴嘎 abaga 363 694 1086 54 169
  14. 9 阿荣旗 arongqi 522 942 624 74 212
  15. ...
  16. In [47]: df.tail() #tail同理
  17. Out[47]:
  18. city pinYin rainy cloudy sunny overcast snowy
  19. 3200 资源 ziyuan 1230 824 199 95 23
  20. 3201 昭平 zhaoping 1333 845 131 61 0
  21. 3202 钟山 zhongshan1 1317 861 131 63 0
  22. 3203 昭平区 zhaopingqu 467 326 66 38 0
  23. 3204 彰化 zhanghua 1241 472 93 117 0

查看元数据

  1. In [48]: df.index #行属性
  2. Out[48]: RangeIndex(start=0, stop=3205, step=1)
  3. In [49]: df.columns #列属性
  4. Out[49]:
  5. Index([u'city', u'pinYin', u'rainy', u'cloudy', u'sunny', u'overcast',
  6. u'snowy'],
  7. dtype='object')
  8. #统计数据,只会对数值类的进行计算
  9. In [51]: df.describe()
  10. Out[51]:
  11. rainy cloudy sunny overcast snowy
  12. count 3205.000000 3205.000000 3205.000000 3205.000000 3205.000000
  13. mean 651.232137 797.288300 423.981591 104.118565 62.204680
  14. std 344.324084 292.436344 302.132459 90.538331 81.090957
  15. min 0.000000 0.000000 0.000000 0.000000 0.000000
  16. 25% 404.000000 596.000000 174.000000 43.000000 9.000000
  17. 50% 543.000000 855.000000 326.000000 86.000000 39.000000
  18. 75% 957.000000 991.000000 668.000000 136.000000 74.000000
  19. max 1775.000000 1761.000000 1424.000000 614.000000 726.000000

另外,df.T求转置

排序

  1. In [64]: df.sort_values(by='sunny',ascending=False).head()
  2. Out[64]:
  3. city pinYin rainy cloudy sunny overcast snowy
  4. 356 磴口 dengkou 221 675 1424 6 33
  5. 2418 乌后旗 wuhouqi 174 718 1421 8 29
  6. 790 杭锦后旗 hangjinhouqi 204 694 1421 11 28
  7. 508 额济纳 ejina 75 761 1405 30 17
  8. 2415 五原 wuyuan 234 675 1405 6 38

选择数据

基本操作(不推荐)

  1. df['city'] #列选择,跟df.city一样
  2. df[0:3] #行选择
  • 通过标签选择
  1. In [74]: df.loc[0:5,['city','rainy']]
  2. Out[74]:
  3. city rainy
  4. 0 阿城 563
  5. 1 昂昂溪区 158
  6. 2 爱民区 269
  7. 3 安达 523
  8. 4 安图 580
  9. 5 鞍山 504
  10. #如果只选择一个标量,用at可以加速
  11. In [79]: df.at[2,'snowy']
  12. Out[79]: 72
  • 通过位置(整数)索引
  1. #单行记录
  2. In [80]: df.iloc[2]
  3. Out[80]:
  4. city 爱民区
  5. pinYin aiminqu
  6. rainy 269
  7. cloudy 304
  8. sunny 253
  9. overcast 17
  10. snowy 72
  11. Name: 2, dtype: object
  12. #中间切片
  13. In [82]: df.iloc[3:6]
  14. Out[82]:
  15. city pinYin rainy cloudy sunny overcast snowy
  16. 3 安达 anda 523 977 700 0 169
  17. 4 安图 antu 580 868 704 2 219
  18. 5 鞍山 anshan 504 736 988 3 133
  19. #取指定一个属性
  20. In [83]: df.iloc[3:6,[2,4]]
  21. Out[83]:
  22. rainy sunny
  23. 3 523 700
  24. 4 580 704
  25. 5 504 988
  26. #同样,如果只选择一个标量,用at可以加速
  27. In [84]: df.iloc[3,3]
  28. Out[84]: 977
  29. In [85]: df.iat[3,3]
  30. Out[85]: 977
  • 布尔索引
  1. In [92]: df[df.cloudy>1600]
  2. Out[92]:
  3. city pinYin rainy cloudy sunny overcast snowy
  4. 493 东方 dongfang 555 1761 3 58 0
  5. 841 哈密 hami 107 1752 467 0 44
  6. 2249 三亚 sanya 722 1621 16 18 0
  7. 2870 伊吾 yiwu 170 1627 466 1 110
  8. 2913 宜昌县 yichangxian 469 1667 121 80 19
  9. #集合包含可以用isin来过滤
  10. In [95]: df[df.snowy.isin([0,1,2,3,4,5])]

设置新值

1.通过Series添加新列

  1. In [45]: s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
  2. In [47]: df['F'] = s1

2.直接修改数据项

  1. In [48]: df.at[dates[0],'A'] = 0
  2. In [49]: df.iat[0,1] = 0
  3. In [50]: df.loc[:,'D'] = np.array([5] * len(df))
  4. #更高阶技巧
  5. In [52]: df2 = df.copy()
  6. In [53]: df2[df2 > 0] = -df2

处理缺失值nan

  1. In [58]: df1.dropna(how='any') #删除有确实的记录
  2. In [59]: df1.fillna(value=n5) #用默认值填充
  3. In [60]: pd.isnull(df1) #返回布尔矩阵,找出有nan的位置

相关操作

统计

  1. In [61]: df.mean() #对每一列进行统计
  2. Out[61]:
  3. A -0.004474
  4. B -0.383981
  5. C -0.687758
  6. D 5.000000
  7. F 3.000000
  8. dtype: float64
  9. In [62]: df.mean(1) #横轴统计
  10. Out[62]:
  11. 2013-01-01 0.872735
  12. 2013-01-02 1.431621
  13. 2013-01-03 0.707731
  14. 2013-01-04 1.395042
  15. 2013-01-05 1.883656
  16. 2013-01-06 1.592306
  17. Freq: D, dtype: float64

Apply定制函数

  1. In [66]: df.apply(np.cumsum)
  2. Out[66]:
  3. A B C D F
  4. 2013-01-01 0.000000 0.000000 -1.509059 5 NaN
  5. 2013-01-02 1.212112 -0.173215 -1.389850 10 1.0
  6. 2013-01-03 0.350263 -2.277784 -1.884779 15 3.0
  7. 2013-01-04 1.071818 -2.984555 -2.924354 20 6.0
  8. 2013-01-05 0.646846 -2.417535 -2.648122 25 10.0
  9. 2013-01-06 -0.026844 -2.303886 -4.126549 30 15.0
  10. In [67]: df.apply(lambda x: x.max() - x.min())
  11. Out[67]:
  12. A 2.073961
  13. B 2.671590
  14. C 1.785291
  15. D 0.000000
  16. F 4.000000
  17. dtype: float64

直方图统计

  1. In [102]: df.cloudy.value_counts() #对于Series进行计数统计

字符串操作

  1. #字符串的操作权包含在 str里面,也是对于Series
  2. In [104]: df.pinYin.str.upper()

合并

concat

  1. In [106]: df
  2. Out[106]:
  3. 0 1 2 3
  4. 0 3 1 3 8
  5. 1 9 8 5 1
  6. 2 1 8 5 2
  7. 3 9 6 8 3
  8. 4 7 2 6 8
  9. 5 5 8 1 2
  10. 6 7 3 9 1
  11. 7 1 1 9 4
  12. 8 3 5 9 5
  13. 9 9 2 9 1
  14. In [107]: pieces = [df[:3],df[3:7],df[7:]]
  15. In [108]: pieces
  16. Out[108]:
  17. [ 0 1 2 3
  18. 0 3 1 3 8
  19. 1 9 8 5 1
  20. 2 1 8 5 2, 0 1 2 3
  21. 3 9 6 8 3
  22. 4 7 2 6 8
  23. 5 5 8 1 2
  24. 6 7 3 9 1, 0 1 2 3
  25. 7 1 1 9 4
  26. 8 3 5 9 5
  27. 9 9 2 9 1]
  28. In [109]: pd.concat(pieces,axis=1)
  29. Out[109]:
  30. 0 1 2 3 0 1 2 3 0 1 2 3
  31. 0 3.0 1.0 3.0 8.0 NaN NaN NaN NaN NaN NaN NaN NaN
  32. 1 9.0 8.0 5.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN
  33. 2 1.0 8.0 5.0 2.0 NaN NaN NaN NaN NaN NaN NaN NaN
  34. 3 NaN NaN NaN NaN 9.0 6.0 8.0 3.0 NaN NaN NaN NaN
  35. 4 NaN NaN NaN NaN 7.0 2.0 6.0 8.0 NaN NaN NaN NaN
  36. 5 NaN NaN NaN NaN 5.0 8.0 1.0 2.0 NaN NaN NaN NaN
  37. 6 NaN NaN NaN NaN 7.0 3.0 9.0 1.0 NaN NaN NaN NaN
  38. 7 NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 9.0 4.0
  39. 8 NaN NaN NaN NaN NaN NaN NaN NaN 3.0 5.0 9.0 5.0
  40. 9 NaN NaN NaN NaN NaN NaN NaN NaN 9.0 2.0 9.0 1.0
  41. In [110]: pd.concat(pieces,axis=0)
  42. Out[110]:
  43. 0 1 2 3
  44. 0 3 1 3 8
  45. 1 9 8 5 1
  46. 2 1 8 5 2
  47. 3 9 6 8 3
  48. 4 7 2 6 8
  49. 5 5 8 1 2
  50. 6 7 3 9 1
  51. 7 1 1 9 4
  52. 8 3 5 9 5
  53. 9 9 2 9 1

join

与SQL中的join一致,调用的是merge方法

  1. #key出现重复,所以直接使用笛卡尔积
  2. In [114]: left = pd.DataFrame({'key':['a','a'],'value':[1,2]})
  3. In [115]: right = pd.DataFrame({'key':['a','a'],'value':[3,4]})
  4. In [116]: pd.merge(left, right, on='key')
  5. Out[116]:
  6. key value_x value_y
  7. 0 a 1 3
  8. 1 a 1 4
  9. 2 a 2 3
  10. 3 a 2 4
  11. #on的key是unique则去重进行join
  12. In [117]: right = pd.DataFrame({'key':['a','b'],'value':[3,4]})
  13. In [118]: left = pd.DataFrame({'key':['a','b'],'value':[1,2]})
  14. In [120]: pd.merge(left,right,on='key')
  15. Out[120]:
  16. key value_x value_y
  17. 0 a 1 3
  18. 1 b 2 4

append

添加一条记录

  1. In [87]: df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
  2. In [88]: df
  3. Out[88]:
  4. A B C D
  5. 0 1.346061 1.511763 1.627081 -0.990582
  6. 1 -0.441652 1.211526 0.268520 0.024580
  7. 2 -1.577585 0.396823 -0.105381 -0.532532
  8. 3 1.453749 1.208843 -0.080952 -0.264610
  9. 4 -0.727965 -0.589346 0.339969 -0.693205
  10. 5 -0.339355 0.593616 0.884345 1.591431
  11. 6 0.141809 0.220390 0.435589 0.192451
  12. 7 -0.096701 0.803351 1.715071 -0.708758
  13. In [89]: s = df.iloc[3]
  14. In [90]: df.append(s, ignore_index=True)
  15. Out[90]:
  16. A B C D
  17. 0 1.346061 1.511763 1.627081 -0.990582
  18. 1 -0.441652 1.211526 0.268520 0.024580
  19. 2 -1.577585 0.396823 -0.105381 -0.532532
  20. 3 1.453749 1.208843 -0.080952 -0.264610
  21. 4 -0.727965 -0.589346 0.339969 -0.693205
  22. 5 -0.339355 0.593616 0.884345 1.591431
  23. 6 0.141809 0.220390 0.435589 0.192451
  24. 7 -0.096701 0.803351 1.715071 -0.708758
  25. 8 1.453749 1.208843 -0.080952 -0.264610
  26. #注意添加的记录数据类型是Series
  27. In [124]: s
  28. Out[124]:
  29. A 0.077384
  30. B -0.716115
  31. C 0.427943
  32. D 0.057282
  33. Name: 3, dtype: float64

分组

  1. In [91]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
  2. ....: 'foo', 'bar', 'foo', 'foo'],
  3. ....: 'B' : ['one', 'one', 'two', 'three',
  4. ....: 'two', 'two', 'one', 'three'],
  5. ....: 'C' : np.random.randn(8),
  6. ....: 'D' : np.random.randn(8)})
  7. ....:
  8. In [92]: df
  9. Out[92]:
  10. A B C D
  11. 0 foo one -1.202872 -0.055224
  12. 1 bar one -1.814470 2.395985
  13. 2 foo two 1.018601 1.552825
  14. 3 bar three -0.595447 0.166599
  15. 4 foo two 1.395433 0.047609
  16. 5 bar two -0.392670 -0.136473
  17. 6 foo one 0.007207 -0.561757
  18. 7 foo three 1.928123 -1.623033
  19. In [93]: df.groupby('A').sum()
  20. Out[93]:
  21. C D
  22. A
  23. bar -2.802588 2.42611
  24. foo 3.146492 -0.63958
  25. #也可以使用其他函数 如
  26. #df.groupby('A').apply(np.sum)

作图

  1. In [135]: ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
  2. In [136]: ts = ts.cumsum()
  3. In [137]: ts.plot()
  4. Out[137]: <matplotlib.axes._subplots.AxesSubplot at 0x1187d7278>
  5. In [138]: plt.show()
  6. #以Index为横坐标,其他值为纵坐标作图

小结

pandas还有很多高级用法,博主也在学习中,以上只列出比较常用的。

根据二八定理,差不多可以开始使用pandas愉快地处理数据了,其他的高级用法就即用即查吧,欢迎大家讨论交流。

pandas快速入门的更多相关文章

  1. Python pandas快速入门

    Python pandas快速入门2017年03月14日 17:17:52 青盏 阅读数:14292 标签: python numpy 数据分析 更多 个人分类: machine learning 来 ...

  2. Pandas 快速入门(二)

    本文的例子需要一些特殊设置,具体可以参考 Pandas快速入门(一) 数据清理和转换 我们在进行数据处理时,拿到的数据可能不符合我们的要求.有很多种情况,包括部分数据缺失,一些数据的格式不正确,一些数 ...

  3. Pandas快速入门笔记

    我正以Python作为突破口,入门机器学习相关知识.出于机器学习实践过程中的需要,我快速了解了一下提供了类似关系型或标签型数据结构的Pandas的使用方法.下面记录相关学习笔记. 数据结构 Panda ...

  4. Pandas快速入门(一)

    快速使用 bogon:Documents rousseau$ ipython --pylab Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23 ...

  5. Pandas快速入门(深度学习入门2)

    源地址为:http://pandas.pydata.org/pandas-docs/stable/10min.html#min Pandas(Python Data Analysis Library) ...

  6. pandas教程1:pandas数据结构入门

    pandas是一个用于进行python科学计算的常用库,包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单.pandas建造在NumPy之上,它使得以NumPy为中心的应用很容 ...

  7. Jupyter 快速入门——写python项目博客非常有用!!!

    from:https://blog.csdn.net/m0_37338590/article/details/78862488 一.简介: Jupyter Notebook(此前被称为 IPython ...

  8. python快速入门——进入数据挖掘你该有的基础知识

    这篇文章是用来总结python中重要的语法,通过这些了解你可以快速了解一段python代码的含义 Python 的基础语法来带你快速入门 Python 语言.如果你想对 Python 有全面的了解请关 ...

  9. [Python]Pandas简单入门(转)

    本篇文章转自 https://colab.research.google.com/notebooks/mlcc/intro_to_pandas.ipynb?hl=zh-cn#scrollTo=zCOn ...

随机推荐

  1. Git强制拉取覆盖本地

    1.多条执行 git fetch --all git reset --hard origin/master git pull 2.单条执行 git fetch --all && git ...

  2. 新版的K8S中的flannel.yaml文件中要注意的细节

    部署flannel作为k8s中的网络插件,yaml文件都大小同异. 但在要注意以下细节. 以前,只需要前面master判断. 现在也需要有not-ready状态了. tolerations: - ke ...

  3. EF分别使用IQueryable和IEnumerable实现更新和删除

    缺点 使用IQueryable无法跟踪,无法监控sql,无法使用SaveChanges(). 优点 使用IQueryable简单粗暴. class Program { static void Main ...

  4. springboot1.5.4 集成cxf完整实例

    WebService 服务端 添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  5. alpha冲刺8/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺倒计时之8 团队部分 后敬甲(组长) 过去两天完成了哪些任务 首页重新设计 课程时间线确定 答辩准备 接下来的计划 ...

  6. aop日志记录

    1.自定义 package cc.mrbird.common.annotation; import java.lang.annotation.ElementType; import java.lang ...

  7. Centos7创建CA和申请证书

    转载:http://rackie386.blog.51cto.com/11279229/1947999 Centos7.3创建CA和申请证书 openssl 的配置文件:/etc/pki/tls/op ...

  8. 分解数据表(将一个datatable按数据量分隔成多个table)

    /// <summary> /// 分解数据表 /// </summary> /// <param name="originalTab">需要分 ...

  9. python中sqlite问题和坑

    import sqlite3 #导入模块 conn = sqlite3.connect('example.db') C=conn.cursor() #创建表 C.execute('''CREATE T ...

  10. XamarinAndroid组件教程设置自定义子元素动画(一)

    XamarinAndroid组件教程设置自定义子元素动画(一) 如果在RecyclerViewAnimators.Animators中没有所需要的动画效果,就可以自定义一个.此时,需要让自定义的动画继 ...