pandas   

  安装方法:pip3 install pandas
  pandas是一个强大的Python数据分析的工具包,它是基于NumPy构建的模块。
  pandas的主要功能:
    具备对其功能的数据结构DataFrame、Series
    集成时间序列功能
    提供丰富的数学运算和操作(实质是NumPy提供的)
    灵活处理缺失数据(NaN)
  引用方法:import pandas as pd

Series

  Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。索引可以自定义如果不谢的话默认是从0开始的数据
1.1、创建方式:

  1. pd.Series([4,7,-5,3])
  2. pd.Series([4,7,-5,3],index=['a','b','c','d'])
  3. pd.Series({'a':1, 'b':2})
  4. pd.Series(0, index=['a','b','c','d'])

1.2、Series比较像列表(数组)和字典的结合体,取Series中某值的话,通过索引可以取值也可以通过位置取值。

  1. In [1]: import pandas as pd
  2. #创建Series
  3. In [2]: a = pd.Series([11,12,13,14,15],index=list("abcde"))
  4.  
  5. In [3]: a
  6. Out[3]:
  7. a 11
  8. b 12
  9. c 13
  10. d 14
  11. e 15
  12. dtype: int64
  13. #取值,通过索引(标签)获取
  14. In [4]: a["a"]
  15. Out[4]: 11
  16. #通过位置获取
  17. In [5]: a[0]
  18. Out[5]: 11

1.3、获取值数组和索引数组:values属性和index属性

  1. In [6]: a
  2. Out[6]:
  3. a 11
  4. b 12
  5. c 13
  6. d 14
  7. e 15
  8. dtype: int64
  9. #获取左侧索引(标签)
  10. In [8]: a.index
  11. Out[8]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
  12. #获取右侧值
  13. In [9]: a.values
  14. Out[9]: array([11, 12, 13, 14, 15], dtype=int64)

1.4、Series特性 (完全继承数组NumPy的特性,唯一不同的是:Series是一维数组)
  Series支持NumPy模块的特性(下标)
  从ndarray创建Series:Series(arr)
  与标量运算:sr*2
  两个Series运算:sr1+sr2
  索引:sr[0], sr[[1,2,4]](花式索引)布尔索引
  布尔值过滤:sr[sr>0]
  切片:sr[0:2]
  也可以通过标签改值:sr[0] = 11
  注意:普通的切片也是一个视图,与NumPy中切片的属性完全一致。
  通用函数:np.abs(sr)
示例代码:

  1. In [11]: import numpy as np
  2. In [12]: import pandas as pd
  3.  
  4. In [13]: a = pd.Series(np.arange(6),index=list("abcdef"))
  5. In [14]: a
  6. Out[14]:
  7. a 0
  8. b 1
  9. c 2
  10. d 3
  11. e 4
  12. f 5
  13. dtype: int32
  14. #标量运算测试
  15. In [15]: a+1
  16. Out[15]:
  17. a 1
  18. b 2
  19. c 3
  20. d 4
  21. e 5
  22. f 6
  23. dtype: int32
  24.  
  25. In [16]: a**2
  26. Out[16]:
  27. a 0
  28. b 1
  29. c 4
  30. d 9
  31. e 16
  32. f 25
  33. dtype: int32
  34.  
  35. In [17]: a+a
  36. Out[17]:
  37. a 0
  38. b 2
  39. c 4
  40. d 6
  41. e 8
  42. f 10
  43. dtype: int32
  44. #索引取值
  45. In [18]: a[0]
  46. Out[18]: 0
  47.  
  48. In [19]: a[-1]
  49. Out[19]: 5
  50. #花式索引取值
  51. In [20]: a[[1,2,4]]
  52. Out[20]:
  53. b 1
  54. c 2
  55. e 4
  56. dtype: int32
  57. #布尔索引判断
  58. In [21]: a>3
  59. Out[21]:
  60. a False
  61. b False
  62. c False
  63. d False
  64. e True
  65. f True
  66. dtype: bool
  67. #布尔索引取值
  68. In [22]: a[a>3]
  69. Out[22]:
  70. e 4
  71. f 5
  72. dtype: int32
  73. #切片
  74. In [23]: b = a[:3]
  75. In [24]: b
  76. Out[24]:
  77. a 0
  78. b 1
  79. c 2
  80. dtype: int32
  81. #切片视图测试
  82. In [25]: b[0]=10
  83.  
  84. In [26]: b
  85. Out[26]:
  86. a 10
  87. b 1
  88. c 2
  89. dtype: int32
  90. In [27]: a
  91. Out[27]:
  92. a 10
  93. b 1
  94. c 2
  95. d 3
  96. e 4
  97. f 5
  98. dtype: int32
  99. #切片拷贝测试
  100. In [28]: c = a[3:].copy()
  101.  
  102. In [29]: c
  103. Out[29]:
  104. d 3
  105. e 4
  106. f 5
  107. dtype: int32
  108.  
  109. In [30]: c[-1]=15
  110.  
  111. In [31]: c
  112. Out[31]:
  113. d 3
  114. e 4
  115. f 15
  116. dtype: int32
  117.  
  118. In [32]: a
  119. Out[32]:
  120. a 10
  121. b 1
  122. c 2
  123. d 3
  124. e 4
  125. f 5
  126. dtype: int32
  127.  
  128. #通用函数测试
  129. In [34]: a[0] = -10
  130. In [35]: a
  131. Out[35]:
  132. a -10
  133. b 1
  134. c 2
  135. d 3
  136. e 4
  137. f 5
  138. dtype: int32
  139.  
  140. In [36]: np.abs(a)
  141. Out[36]:
  142. a 10
  143. b 1
  144. c 2
  145. d 3
  146. e 4
  147. f 5
  148. dtype: int32

1.5、Series支持字典的特性(标签):
  可以通过字典创建Series:
    dic = {"a":1,"b":2,"c":3}
    pd.Series(dic),
  in运算,判断键在不在Series中,返回布尔值。get也可以判断,但不会报错!
    ’a’ in sr
  键索引:sr['a'], sr[['a', 'b', 'd']],也支持切片
    当用标签去切片的时候,是可以取到结果的!原因:数组是有序的!并且切片得到的结果不同于数组的切片是顾头顾尾!

  不同点:for 循环得到的是values值而不是索引!可以理解为数组的权重高!
示例代码:

  1. In [37]: dic = {"a":1,"b":2,"c":3}
  2. #通过字典创建Series数据
  3. In [38]: a = pd.Series(dic)
  4. In [39]: a
  5. Out[39]:
  6. a 1
  7. b 2
  8. c 3
  9. dtype: int64
  10.  
  11. #in判断
  12. In [40]: "a" in a
  13. Out[40]: True
  14. In [41]: "d" in a
  15. Out[41]: False
  16.  
  17. #切片
  18. #通过标签切片
  19. In [42]: a["a":"b"]
  20. Out[42]:
  21. a 1
  22. b 2
  23. dtype: int64
  24. In [43]: a["b":]
  25. Out[43]:
  26. b 2
  27. c 3
  28. dtype: int64
  29. #通过索引切片
  30. In [44]: a[:2]
  31. Out[44]:
  32. a 1
  33. b 2
  34. dtype: int64
  35.  
  36. #索引与花式索引
  37. In [45]: a["a"]
  38. Out[45]: 1
  39. In [46]: a[["a","c"]]
  40. Out[46]:
  41. a 1
  42. c 3
  43. dtype: int64
  44. #for循环取值
  45. In [47]: for i in a:
  46. ...: print(i)
  47. ...:
  48. 1
  49. 2
  50. 3

1.6、整数索引:
  大家都知道,切片的时候中括号中可以放标签也可以放下标;如果标签是整数,通过切片方式获取值的话,当数值既可以解释成标签也可以解释成下标的时候,他会解释成标签所以最好避免这种以数字作为索引(标签)的方式!要不然会产生各种误会!

  可以通过两个属性来解决这个问题:
    loc 默认通过标签形式解释
    iloc 默认是以下标形式解释
  注意:loc or iloc 可以传一个值,也可以切片
示例代码:

  1. #生成Series数组对象
  2. In [48]: b = pd.Series(np.arange(10,20),index=np.arange(10,20))
  3. In [49]: b
  4. Out[49]:
  5. 10 10
  6. 11 11
  7. 12 12
  8. 13 13
  9. 14 14
  10. 15 15
  11. 16 16
  12. 17 17
  13. 18 18
  14. 19 19
  15. dtype: int32
  16. #通过下标获取
  17. In [50]: b[0]
  18. -------------------------------------------------------------------
  19. KeyError Traceback (most recent call last)
  20. <ipython-input-50-422167f1cdee> in <module>()
  21. ----> 1 b[0]
  22. c:\program files\python36\lib\site-packages\pandas\core\series.py in __getitem__(self, key
  23. )
  24. 599 key = com._apply_if_callable(key, self)
  25. 600 try:
  26. --> 601 result = self.index.get_value(self, key)
  27. 602
  28. 603 if not is_scalar(result):
  29.  
  30. c:\program files\python36\lib\site-packages\pandas\core\indexes\base.py in get_value(self,
  31. series, key)
  32. 2475 try:
  33. 2476 return self._engine.get_value(s, k,
  34. -> 2477 tz=getattr(series.dtype, 'tz', None))
  35. 2478 except KeyError as e1:
  36. 2479 if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:
  37.  
  38. pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value (pandas\_libs\index.c:4
  39. 404)()
  40.  
  41. pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value (pandas\_libs\index.c:4
  42. 087)()
  43.  
  44. pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas\_libs\index.c:512
  45. 6)()
  46.  
  47. pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item
  48. (pandas\_libs\hashtable.c:14031)()
  49.  
  50. pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item
  51. (pandas\_libs\hashtable.c:13975)()
  52.  
  53. KeyError: 0
  54. #通过下标切片获取
  55. In [51]: b[-2:]
  56. Out[51]:
  57. 18 18
  58. 19 19
  59. dtype: int32
  60. #通过标签上的数字
  61. In [52]: b[10]
  62. Out[52]: 10
  63. In [53]: b[19]
  64. Out[53]: 19
  65. #但无法完成切片
  66. In [54]: b[10:15]
  67. Out[54]: Series([], dtype: int32)
  68.  
  69. In [60]: b
  70. Out[60]:
  71. 10 10
  72. 11 11
  73. 12 12
  74. 13 13
  75. 14 14
  76. 15 15
  77. 16 16
  78. 17 17
  79. 18 18
  80. 19 19
  81. dtype: int32
  82. #同过loc和iloc获取
  83. In [61]: b.loc[10]
  84. Out[61]: 10
  85. In [63]: b.loc[19]
  86. Out[63]: 19
  87.  
  88. In [64]: b.iloc[0]
  89. Out[64]: 10
  90. In [65]: b.iloc[-1]
  91. Out[65]: 19

1.7、Series数据对齐 (常用运算)
【Series在计算时,会先按照标签对齐,然后才会计算】
  pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。

  1. sr1 = pd.Series([12,23,34], index=['c','a','d'])
  2. sr2 = pd.Series([11,20,10], index=['d','c','a',])
  3. sr1+sr2
  4. sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])
  5. sr1+sr3

  所以当两个Series的标签不同时,第一步会先合并标签,然后在计算时会把不同标签的值写成NaN(缺失值),原标签对应的值就不存在。这是因为在进行计算的时候,不同的标签只有一个值,当他与一个缺失标签进行计算的话就会变成缺失值。

  那如何在两个Series对象相加时将缺失值设为0呢?在做不同运算的时候,添加相关参数:fill_value=0;定义默认缺失标签值为0

  1. sr1.add(sr2, fill_value=0)

灵活的算术方法:add, sub, div, mul
示例代码:

  1. #定义两个Series数组对象
  2. In [68]: sr1 = pd.Series([12,23,34], index=['c','a','d']);
  3. In [69]: sr2 = pd.Series([11,20,10], index=['d','c','a',])
  4. #查看数据
  5. In [70]: sr1
  6. Out[70]:
  7. c 12
  8. a 23
  9. d 34
  10. dtype: int64
  11. In [71]: sr2
  12. Out[71]:
  13. d 11
  14. c 20
  15. a 10
  16. dtype: int64
  17. #数据对齐加法计算
  18. In [72]: sr1+sr2
  19. Out[72]:
  20. a 33
  21. c 32
  22. d 45
  23. dtype: int64
  24. #在定义另一个Series对象
  25. In [73]: sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])
  26. #查看
  27. In [74]: sr3
  28. Out[74]:
  29. d 11
  30. c 20
  31. a 10
  32. b 14
  33. dtype: int64
  34. ##数据对齐加法计算(标签并集,缺失值)
  35. In [75]: sr1+sr3
  36. Out[75]:
  37. a 33.0
  38. b NaN
  39. c 32.0
  40. d 45.0
  41. dtype: float64
  42. #解决标签对应缺失值问题
  43. In [76]: sr1.add(sr3,fill_value=0)
  44. Out[76]:
  45. a 33.0
  46. b 14.0
  47. c 32.0
  48. d 45.0
  49. dtype: float64

1.8、Series关于缺失数据
【注意pandas是不会在原来的数据上修改,需要接收修改覆盖掉,或是重新接收】
  缺失数据:使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。内置的None值也会被当做NaN处理。
  缺失值表示方式:na nan NaN null
  处理缺失数据的相关方法:
    dropna() 过滤掉值为NaN的行
    fillna() 填充缺失数据
    isnull() 返回布尔数组,缺失值对应为True
    notnull() 返回布尔数组,缺失值对应为False
  过滤缺失数据:sr.dropna() 或 sr[sr.notnull()]
  填充缺失数据:sr.fillna(0)

  判断是缺失值的方法:sr.isnull() 返回是布尔值的数组,缺失值对应为True
  判断不是缺失值的方法:sr.notnull() 返回是布尔值的数组,缺失值对应为False

  处理缺失数据有两种办法:
    一种是去除不再需要:sr = sr.dropna();
    另一种是填上默认值: sr.fillna(1) 用某值把NaN填上参数
示例代码:

  1. In [78]: d
  2. Out[78]:
  3. a 33.0
  4. b NaN
  5. c 32.0
  6. d 45.0
  7. dtype: float64
  8. #去除缺失值
  9. In [79]: d.dropna()
  10. Out[79]:
  11. a 33.0
  12. c 32.0
  13. d 45.0
  14. dtype: float64
  15. #缺失值判断
  16. In [80]: d.isnull()
  17. Out[80]:
  18. a False
  19. b True
  20. c False
  21. d False
  22. dtype: bool
  23. #非缺失值判断
  24. In [81]: d.notnull()
  25. Out[81]:
  26. a True
  27. b False
  28. c True
  29. d True
  30. dtype: bool
  31. #缺失值填充
  32. In [82]: d.fillna(111)
  33. Out[82]:
  34. a 33.0
  35. b 111.0
  36. c 32.0
  37. d 45.0
  38. dtype: float64

NumPy中的通用函数,Series全部支持!

DataFrame

  DataFrame是一个表格型的数据结构,含有一组有序的列,要求每一列的数据类型必须相同。DataFrame可以被看做是由Series组成的字典,并且共用一个Series的索引。

2.1、创建方式(很多种,以字典类型举例):

  1.   pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
  2.   pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
  3.   ……

  列索引就是创建时字典的键,行索引就是Series的标签;创建的时候还是需要数据对齐的问题!!!

2.2、csv文件读取与写入:

  1.   pd.read_csv('filename.csv') #读取 传值可以是文件对象,可以是文件名;
  2.   pd.to_csv() #写入 存储文件的时候,会默认把标签列存入,所以存储的时候需要处理下,指定不存储索引。
  3. csv格式存储数据,所有的数据都是以逗号隔开;python内置有处理csv文件的库

2.3、DataFrame查看数据
  查看数据常用属性及方法:

  1.     index 获取行索引
  2.     T 转置 【行列互换】
  3.     columns 获取列索引
  4.     values 获取值 【二维数组,一行代表一条】
  5.     describe() 快速统计 【按列打印的统计描述信息】

name属性:(df 是 DataFrame 对象简写。)
  DataFrame 对象每一列都会有一个name属性,就是每列的id名。
  1、索引(标签)列的id名:

  1.     df.index.name # 查看id
  2.     df.index.name = "###" #给索引列添加或是改名

  2、DataFrame各列name属性:

  1.     对列改名:df.rename(columns={"原列名":"新列名",.....})

2.4、DataFrame索引和切片
  DataFrame是结合了NumPy和series的所有方法,所以他具有各种各样的花式索引。不同的是:DataFrame有行索引和列索引。

注意:
  1、df[] 只能选列,不能选行(直接索引,花式索引都可以,切片不行);如果选择的仅一列可以看作是Series去操作
  2、df[]通过索引得到的数据还是DataFrame对象。
  3、df[0:10]如果直接切片操作,DataFrame对象会解释为行,这之后也可以使用列的花式索引!
  4、不建议使用上述方法去切片,如果要取一个值的话,可以使用!

  获取数据正确的打开方式是:loc[[行,列]]【标签索引】和iloc[[行下标,列下标]]【下标索引】
    df.loc[[:10,["close","open"]]] #获取前10行 close和open列的数据
    df.iloc[[:10,:2]]

  1. 1.1、通过标签获取:
  2. df['A'] #只取单列
  3. df[['A', 'B']] #取a,b两列
  4. df['A'][0] #取A列上第一个值
  5. df[0:10][['A', 'C']] #取前10行A、C两列的值
  6.  
  7. #通过loc属性进行切片操作获取需要的数据
  8. df.loc[:,['A','B']] #获取A、B两列
  9. df.loc[:,'A':'C'] #切片获取 A、B、C三列
  10. df.loc[0,'A'] #获取单个数据
  11. df.loc[0:10,['A','C']] ##取前10行A、C两列的值
  12. 1.2、通过位置获取:(记住是通过下标去获取的!)
  13. df.iloc[3]
  14. df.iloc[3,3]
  15. df.iloc[0:3,4:6]
  16. df.iloc[1:5,:]
  17. df.iloc[[1,2,4],[0,3]]
  18.  
  19. 1.3、通过布尔值过滤:
  20. df[df['A']>0] # 通过某一列过滤的数据
  21. df[df<0] #把获取所有为负数的数据 会把所有False对应的值改成NaN,而不是舍去;因为DataFrame是二维数组,无法删除某一行或是某一列。
  22. df[df<0].fillna(0) #给所有NaN的位置赋值为0
  23.  
  24. df[df['id'].isin([1,3,5])] #isin是在集合中查询,查找某一列中有没有对应值的数据,返回布尔值,然后通过这些值过滤出行。
  25. #同一类型的数据下,可以通过布尔索引过滤,对是NaN的值赋值
  26. df[df["C"]<20] = 0

注意:df[df<20]

  代码如上:dataframe 直接做布尔值索引,是直接对整个dataframe数据做的判断,把小于20的False全部改成NaN。
  给NaN赋值:df[df<20].fillna(0) 全部赋值为0。

2.5、DataFrame数据对齐与缺失数据
数据对齐:
  DataFrame对象在运算时,同样会进行数据对齐,结果的行索引与列索引分别为两个操作数的行索引与列索引的并集。(数据对齐不仅是列对齐,行也必须对齐!)
DataFrame处理缺失数据的方法【与Series的方法一致】。
  

  1. dropna(axis=0,where='any',…) #默认是判断一行中有没有NaN,有的话会把这一行删除。默认对行操作,默认是any
  2.   #参数解释:
  3.   # where="any"/"all" any指:这一行中有一个NaN就删除;all指:这一行中全部都是NaN才删除;
  4.   # axis 指对行还是对列执行删除操作:0代表行,1代表列
  5.   fillna()
  6.   isnull()
  7.   notnull()

2.6、其他常用方法 (注意数据的类型)

  1. pandas常用方法(适用SeriesDataFrame):
  2.   mean(axis=0,skipna=False) #平均值
  3.   sum(axis=1) #求和
  4.   sort_index(axis, …, ascending) 按行或列索引排序
  5.   #参数:
  6.     # ascending升序降序,默认为True,改为False为降序
  7.     # axis 指行或列,默认为行
  8.   sort_values('列名', axis, ascending) 按值排序/按列排序
  9.   #注意点:排序可以传入一个列表,表示按照关键字排序,优先按照第一个元素排序,一样的话再按照第二个排序,依次类推!
  10.     sort_values(["close","id"])

NumPy的通用函数同样适用于pandas

  1. #参数为函数的方法,把所有的元素都执行一遍这个函数
  2. apply(func, axis=0) 将自定义函数应用在各行或者各列上,func可返回标量或者Seriesfunc可返回标量或者Series
  3. applymap(func) 将函数应用在DataFrame各个元素上
  4. map(func) 将函数应用在Series各个元素上
  5.  
  6. df.applymap(lambda x:x+1) #操作对象是元素
  7. df["close"].map(lambda x:x+1)
  8. df.apply(lambda x:x.sum) #默认操作对象为一列数据

2.7、层次化:

  就是有多层索引!通过索引一层一层的去获取数据!
  层次化索引是Pandas的一项重要功能,它使我们能够在一个轴上拥有多个索引级别。

  1. 例:data=pd.Series(np.random.rand(9), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], [1,2,3,1,2,3,1,2,3]])

2.8、从文件读取

1、读取文件:从文件名、URL、文件对象中加载数据

  1.     read_csv 默认分隔符为,[逗号]
  2.     read_table 默认分隔符为\t

2、读取文件函数主要参数:

  1. sep 指定分隔符,也可以用正则表达式,如:'\s+'
  2. header=None 指定文件无列名 (会改成编号0123) 不写默认把第一行转换成列名
  3. names 指定列名 names=["列名1","列名2",....]可以指定列名
  4. index_col 指定某列作为索引(行索引) [比其他列名低一格]
  5. na_values 指定某些字符串表示缺失值 na_values=["none","None","na","nan","NaN","null"] 把列表内的数据解析成
  6. parse_dates 指定某些列是否被解析为日期,传值是布尔值或列表 转化成时间对象,默认为True
  7. skiprows 跳过某几行不读 skiprows=["行索引",...]

3、写入到文件:

  1. 写入到文件的方法:to_csv

写入文件函数的主要参数:

  1. sep 指定分隔符,
  2. na_rep 指定缺失值转换的字符串,默认为空字符串
  3. header=False 不输出列名一行
  4. index=False 不输出行索引一列 保存文件的时候不保存索引列
  5. cols 指定输出的列,参数传入为列表,元素为列名
  6.  
  7. 其他文件类型:json, XML, HTML, 数据库
  8. pandas转换为二进制文件格式(pickle):
  9. save
  10. load  

2.8、时间对象处理
1、时间序列类型:
  时间戳:特定时刻
  固定时期:如2017年7月
  时间间隔:起始时间-结束时间
Python标准库:datetime 需要指定时间格式

  1. date time datetime timedelta
  2.   strftime() #对象转成字符串
  3.   strptime() #字符串转换成对象

第三方包:dateutil

  1. import dateutil
  2.   dateutil.parser.parse() #不用指定格式,直接对时间字符串类型转换成时间对象。

成组处理日期:pandas

  1. pd.to_datetime(['2001-01-01', '2002-02-02'])

2、产生时间对象数组:date_range

  1. start 开始时间
  2.   end 结束时间
  3.   periods 时间长度 给定起始时间(字符串类型),指定时间长度,生成多少天
  4.   freq 时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth)【半个月】,M(onth),(min)T(es), S(econd), A(year),…
  5.     W-MON 每周一...可以看文档查找

2.9、时间索引
  时间序列就是以时间对象为索引的Series或DataFrame。

  datetime对象作为索引时是存储在DatetimeIndex对象中的。
1、时间索引特殊功能:
  1)传入“年”或“年月”作为切片方式

  1. df["2017"] #会把2017年的数据全部算出来;
  2. df["2017-02"] #会把2017年2月的所有数据取出来

  2)传入日期范围作为切片方式

  1. df["2017-01-01":"2017-05-08"] #按照时间切片获取,后包括切片时间内容。

 补充:

1、补充 array or Series中的两个方法:

  1. shift(n) 移动 操作一维数组,向右移动n个位置 【若n为负数,那向右移动为负,所以为向左移动】空出的位置是缺失值为NaN
  2. rolling(n) 滚动,向前滚动n行(每次带n行迭代),默认最后一行为中心带着前边n-1行,作为窗口向前滚动。实质就是内部实现遍历切片功能!

2、注意在向二维数组写值的时候,不要用连续的中括号!!!否则会有warning警告!

  1.   df["ma5"] = np.nan #正确示范

3、DataFrame数据类型与数据库结构很像,但不会存放在数据库中而是存放在内存,大数据分析要的是速度。当数据量过于庞大时,从内存中获取数据的速度远比在硬盘中获取的快。

  DataFrame数据类型与数据库结构很像,所以说数据库的相关操作,DataFrame数据也有:

  1. 例如:
  2.   分组:df.groupby("A")
  3.     .sum() 组内求和
  4.     .size() 分组的个数;.
  5.     .get_group('foo') 查看复组
  6.  
  7.   组合分组,返回的是层级索引
  8.     df.groupby("A","B")
  9.  
  10.   连表操作:
  11.     np.merge(数组1,数组2) 参数on="列名" 以某列做join how="方法" 连表方法 inner ,left,right

创建数据:

  1. #创建数据:
  2. import pandas as pd
  3. import numpy as np
  4.  
  5. df = pd.DataFrame(
  6. {"A":["foo","bar","foo","bar","foo","bar","foo","bar",],
  7. "B":["one","one","two","three","two","two","one","three"],
  8. "C":np.random.randn(8),
  9. "D":np.random.randn(8),
  10. })
  11. #执行方法测试
  12. #单分组
  13. s = df.groupby("A")
  14. s.sum()
  15. s.size()
  16. s.get_group("foo") #根据列获取分组该名下对应的数据
  17.  
  18. #组合分组
  19. ss = df.groupby(["A","B"])
  20.  
  21. #连表操作:
  22. #创建数据
  23. left = pd.DataFrame({
  24. "key":["K0","K1","K2","K3",],
  25. "A":["A0","A1","A2","A3",],
  26. "B":["B0","B1","B2","B3",],
  27. })
  28.  
  29. right = pd.DataFrame({
  30. "key":["K0","K1","K2","K3",],
  31. "C":["C0","C1","C2","C3",],
  32. "D":["D0","D1","D2","D3",],
  33. })
  34. #连表方法
  35. result = pd.merge(left,right,)
  36. result = pd.merge(left,right,on="key")
  37. result = pd.merge(left,right,on="key",how="inner")

代码执行结果:

  1. In [28]: import pandas as pd
  2. ...: import numpy as np
  3. ...:
  4. ...: df = pd.DataFrame(
  5. ...: {"A":["foo","bar","foo","bar","foo","bar","foo","bar",],
  6. ...: "B":["one","one","two","three","two","two","one","three"],
  7. ...: "C":np.random.randn(8),
  8. ...: "D":np.random.randn(8),
  9. ...: })
  10. ...:
  11.  
  12. In [29]: df
  13. Out[29]:
  14. A B C D
  15. 0 foo one -0.475396 -0.395205
  16. 1 bar one 0.197466 -0.371583
  17. 2 foo two 0.696546 0.818669
  18. 3 bar three -0.205806 0.368646
  19. 4 foo two -0.293573 1.889839
  20. 5 bar two 0.433100 -0.668867
  21. 6 foo one 1.099607 1.725991
  22. 7 bar three -0.760478 0.576407
  23.  
  24. In [30]: s = df.groupby("A")
  25.  
  26. In [31]: s
  27. Out[31]: <pandas.core.groupby.DataFrameGroupBy object at 0x00000000070F3AC8>
  28.  
  29. In [32]: s.sum()
  30. Out[32]:
  31. C D
  32. A
  33. bar -0.335718 -0.095396
  34. foo 1.027184 4.039294
  35.  
  36. In [33]: s.size()
  37. Out[33]:
  38. A
  39. bar 4
  40. foo 4
  41. dtype: int64
  42.  
  43. In [34]: s.get_group("foo")
  44. Out[34]:
  45. B C D
  46. 0 one -0.475396 -0.395205
  47. 2 two 0.696546 0.818669
  48. 4 two -0.293573 1.889839
  49. 6 one 1.099607 1.725991
  50.  
  51. In [36]: ss = df.groupby(["A","B"])
  52. In [40]: ss.sum()
  53. Out[40]:
  54. C D
  55. A B
  56. bar one 0.197466 -0.371583
  57. three -0.966284 0.945053
  58. two 0.433100 -0.668867
  59. foo one 0.624211 1.330786
  60. two 0.402973 2.708508
  61.  
  62. #执行效果
  63. In [20]: left = pd.DataFrame({
  64. ...: "key":["K0","K1","K2","K3",],
  65. ...: "A":["A0","A1","A2","A3",],
  66. ...: "B":["B0","B1","B2","B3",],
  67. ...: })
  68.  
  69. In [21]: right = pd.DataFrame({
  70. ...: "key":["K0","K1","K2","K3",],
  71. ...: "C":["C0","C1","C2","C3",],
  72. ...: "D":["D0","D1","D2","D3",],
  73. ...: })
  74. #单纯连表
  75. In [22]: result = pd.merge(left,right,)
  76. In [23]: result
  77. Out[23]:
  78. A B key C D
  79. 0 A0 B0 K0 C0 D0
  80. 1 A1 B1 K1 C1 D1
  81. 2 A2 B2 K2 C2 D2
  82. 3 A3 B3 K3 C3 D3
  83. #指定连表列
  84. In [24]: result = pd.merge(left,right,on="key")
  85. In [25]: result
  86. Out[25]:
  87. A B key C D
  88. 0 A0 B0 K0 C0 D0
  89. 1 A1 B1 K1 C1 D1
  90. 2 A2 B2 K2 C2 D2
  91. 3 A3 B3 K3 C3 D3
  92. #指定连表列和连表类型
  93. In [26]: result = pd.merge(left,right,on="key",how="inner")
  94. In [27]: result
  95. Out[27]:
  96. A B key C D
  97. 0 A0 B0 K0 C0 D0
  98. 1 A1 B1 K1 C1 D1
  99. 2 A2 B2 K2 C2 D2
  100. 3 A3 B3 K3 C3 D3

Py修行路 Pandas 模块基本用法的更多相关文章

  1. Py修行路 NumPy模块基本用法

    NumPy系统是Python的一种开源的数值计算扩展,一个用python实现的科学计算包.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结 ...

  2. Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块

    一.前提介绍: 可以开辟作用域的只有类,函数,和模块            for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...

  3. Py修行路 python基础 (二十三)模块与包

    一.模块 1)定义: 模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2)为何要用模块: 退出python解释器然后重新进入,那之前定义的函数或者变量都将丢失,因 ...

  4. Py修行路 python基础 (二十一)logging日志模块 json序列化 正则表达式(re)

    一.日志模块 两种配置方式:1.config函数 2.logger #1.config函数 不能输出到屏幕 #2.logger对象 (获取别人的信息,需要两个数据流:文件流和屏幕流需要将数据从两个数据 ...

  5. Py修行路 Matplotlib 绘图及可视化模块

    Matplotlib是一个强大的Python绘图和数据可视化的工具包. 安装方法:pip install matplotlib 引用方法:import matplotlib.pyplot as plt ...

  6. Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  7. Py修行路 python基础 (十八) 反射 内置attr 包装

    一.isinstance 和 issubclass1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象.2.issubclass(sub, super)检查sub类是否是 ...

  8. Py修行路 python基础 (二十五)线程与进程

    操作系统是用户和硬件沟通的桥梁 操作系统,位于底层硬件与应用软件之间的一层 工作方式:向下管理硬件,向上提供接口 操作系统进行切换操作: 把CPU的使用权切换给不同的进程. 1.出现IO操作 2.固定 ...

  9. Py修行路 python基础 (十一)迭代器 与 生成器

    一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中就是 ...

随机推荐

  1. jqgrid的scroll参数的使用

    scroll参数会影响addJSONData(data)方法的使用 存在scroll参数,addJSONData方法会往表格中追加数据: 不存在scroll参数时,addJSONData方法会覆盖表格 ...

  2. Hadoop的RPC机制源码分析

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://www.cnblogs.com/sh425/p/6893662.html )2. ...

  3. [转]Android:改变Activity切换方式

    overridePendingTransition(enterAnim, exitAnim); Intent intent =new Intent(this,item2.class); startAc ...

  4. tp后台注册登录配置项

    1.在application目录下Common/Conf/config.php中 2-17行,首先判断在data目录下有没有特意设置的db.php, config.php,route.php,如果有就 ...

  5. 在openrc中从keystone V2 到 V3

    #!/bin/bash ] then echo "Usage $0 <keystone.rc>" exit fi . $ NEW_OS_AUTH_URL=`echo $ ...

  6. Android当下最流行的开源框架总结

    Android中能够简化开发流程的一些框架 本文介绍的是一些博主在开发过程中经常用到的Android开源框架,所谓开源框架我的理解就是别人封装好的代码,可以直接拿过来使用,并且源码也全部公开的代码库. ...

  7. MSDN 单机 MVC 帮助文档

    因为微软的mvc框架也是从开源框架演变而来的,所以微软没把mvc帮助文档放到单击帮助文档中.sososos下载好msdn单机帮助后,却找不到 System.Web.MVC 等命名空间的东西. 解决办法 ...

  8. web测试中的测试点和测试方法总结

    测试是一种思维,包括情感思维和智力思维,情感思维主要体现在一句俗语:思想决定行动上(要怀疑一切),智力思维主要体现在测试用例的设计上.具有了这样的思想,就会找出更多的bug.   一.输入框 1.字符 ...

  9. 浅谈 C# CLR 执行模块

    前言: 买了这本 CLR via C# 已有些日子了,但是一直没有认真翻过这本书,以前学的知识点都忘光了. 趁着现在下着雨的周末,大体记录一下今天了解的笔记,也好弥补一下 C# 知识上的一些盲点.   ...

  10. JS中的“use strict” 严格模式

    1.介绍严格模式 2.严格模式影响范围 变量:  var.delete.变量关键字 对象: 只读属性. 对象字面量属性重复申明 函数:参数重名.arguments对象.申明 其他:this.eval. ...