learn numpy & pandas 学习笔记2

网易云课堂:
https://study.163.com/course/courseMain.htm?courseId=1003240004
莫烦主页:
https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/



import numpy as np
# A = np.array([1,1,1])    #A是一个序列,并不是个矩阵
# B = np.array([2,2,2])

# print(A)
# print(B)
# print(np.vstack((A,B)))    # vertical stack  垂直方向上合并
# """
# [[1,1,1]
#  [2,2,2]]
# """


# C = np.vstack((A,B))      
# print(A.shape,C.shape)
# # (3,) (2,3)
# D = np.hstack((A,B))       # horizontal stack  水平合并
# print(D)
# # [1,1,1,2,2,2]
# print(A.shape,D.shape)
# # (3,) (6,)

# # print(A.T)  #这并不能显示一列三个1

# print(A[np.newaxis,:])  #这句话把A变成一行三列的一个矩阵
# # [[1 1 1]]
# print(A[np.newaxis,:].shape)   #打印A的矩阵类型
# # (1,3)
# print(A[:,np.newaxis])   # 把A变成一个三行一列的矩阵
# """
# [[1]
# [1]
# [1]]
# """
# print(A[:,np.newaxis].shape)   #打印A的矩阵类型
# # (3,1)


import numpy as np
A = np.array([1,1,1])[:,np.newaxis]
B = np.array([2,2,2])[:,np.newaxis]
# print(A)
# # [[1]
# #  [1]
# #  [1]]
# print(B)
# # [[2]
# #  [2]
# #  [2]]

# C = np.vstack((A,B))   # vertical stack
# D = np.hstack((A,B))   # horizontal stack

# print(C)
# '''
# [[1]
#  [1]
#  [1]
#  [2]
#  [2]
#  [2]]
# '''
# print(D)
# '''
# [[1 2]
#  [1 2]
#  [1 2]]
#  '''
# print(A.shape,C.shape,D.shape)
# # (3, 1) (6, 1) (3, 2)

C = np.concatenate((A,B,B,A),axis=0)  #在列方向合并
print(C)       #axis参数很好的控制了矩阵的纵向或是横向打印,相比较vstack和hstack函数显得更加方便
'''
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]
'''

D = np.concatenate((A,B,B,A),axis=1)   #在行方向合并
print(D)
 '''
 [[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]
 '''


import numpy as np
A = np.arange(12).reshape((3, 4))
# print(A)
'''
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
'''

# print(np.split(A, 2, axis=1))  #纵向均分矩阵
# print(np.split(A, 3, axis=0))    #横向均分矩阵

# print(np.split(A, 3, axis=1))
#范例的Array只有4列,只能等量对分,因此输入以上程序代码后Python就会报错


# print(np.array_split(A, 3, axis=1))
#在机器学习时经常会需要将数据做不等量的分割,因此解决办法为np.array_split()

#在Numpy里还有np.vsplit()与横np.hsplit()方式可用。
# print(np.vsplit(A, 3))  #等于 print(np.split(A, 3, axis=0))
print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
#  Numpy copy & deep copy

import numpy as np

a = np.arange(4)
# array([0, 1, 2, 3])

# b = a
# c = a
# d = b
# #改变a的第一个值,b、c、d的第一个值也会同时改变。
# a[0] = 11
# print(a)
# # array([11,  1,  2,  3])
# # 确认b、c、d是否与a相同。
# b is a  # True
# c is a  # True
# d is a  # True
# #同样更改d的值,a、b、c也会改变。
# d[1:3] = [22, 33]   # array([11, 22, 33,  3])
# print(a)            # array([11, 22, 33,  3])
# print(b)            # array([11, 22, 33,  3])
# print(c)            # array([11, 22, 33,  3])

#copy() 的赋值方式没有关联性
b = a.copy()    # deep copy
print(b)        # array([11, 22, 33,  3])
a[3] = 44
print(a)        # array([11, 22, 33, 44])
print(b)        # array([11, 22, 33,  3])

# 如果用 python 的列表和字典来作比较, 那么可以说 Numpy 是列表形式的,没有数值标签,而 Pandas 就是字典形式。Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。
#要使用pandas,首先需要了解他主要两个数据结构:Series和DataFrame。

import pandas as pd
import numpy as np

# s = pd.Series([1,3,6,np.nan,44,1])
# print(s)   #Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引。于是会自动创建一个0到N-1(N为长度)的整数型索引。
'''
0     1.0
1     3.0
2     6.0
3     NaN
4    44.0
5     1.0
dtype: float64
'''

dates = pd.date_range('20160101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
# print(df)
'''
            a         b         c         d
2016-01-01  0.102676  0.427523 -0.680943  1.007115
2016-01-02 -0.773084  0.619988  0.379934  1.172427
2016-01-03 -0.036123 -0.863392 -0.171760  0.890251
2016-01-04  0.517382 -0.155783 -0.738340  1.278619
2016-01-05 -1.647704 -1.505080 -0.243351  0.248558
2016-01-06 -0.386770  1.982197  1.358165  0.101179
'''
'''
DataFrame是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。

我们可以根据每一个不同的索引来挑选数据, 比如挑选 b 的元素:
'''
# print(df['b'])
'''
2016-01-01    1.864800
2016-01-02   -2.756416
2016-01-03   -1.185833
2016-01-04    1.399641
2016-01-05    0.966624
2016-01-06    0.617307
Freq: D, Name: b, dtype: float64
'''

#我们在创建一组没有给定行标签和列标签的数据 df1:
# df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
# print(df1)
'''
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
'''
#这样,他就会采取默认的从0开始 index. 还有一种生成 df 的方法, 如下 df2:
df2 = pd.DataFrame({'A' : 1.,
                    'B' : pd.Timestamp('20130102'),
                    'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                    'D' : np.array([3] * 4,dtype='int32'),
                    'E' : pd.Categorical(["test","train","test","train"]),
                    'F' : 'foo'})
                    
# print(df2)
'''
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo
'''
#这种方法能对每一列的数据进行特殊对待. 如果想要查看数据中的类型, 我们可以用 dtype 这个属性:
# print(df2.dtypes)   #查看每列的数据类型
'''
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object
'''
# print(df2.index)  #看行号:
#  Int64Index([0, 1, 2, 3], dtype='int64')

# print(df2.columns)  #看列的名称
# Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

# print(df2.values)   #看所有df2的值:
'''
[[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo']
 [1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']
 [1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo']
 [1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']]
'''
#想知道数据的总结, 可以用 describe():
# df2.describe()    #输出数值类型的常用统计数据
"""
         A    C    D
count  4.0  4.0  4.0
mean   1.0  1.0  3.0
std    0.0  0.0  0.0
min    1.0  1.0  3.0
25%    1.0  1.0  3.0
50%    1.0  1.0  3.0
75%    1.0  1.0  3.0
max    1.0  1.0  3.0
"""

#如果想翻转数据, transpose:
# print(df2.T)   #转置
'''
                     0                    1                    2  \
A                    1                    1                    1   
B  2013-01-02 00:00:00  2013-01-02 00:00:00  2013-01-02 00:00:00   
C                    1                    1                    1   
D                    3                    3                    3   
E                 test                train                 test   
F                  foo                  foo                  foo   

                     3  
A                    1  
B  2013-01-02 00:00:00  
C                    1  
D                    3  
E                train  
F                  foo  
'''

#如果想对数据的 index 进行排序并输出:
# print(df2.sort_index(axis=1, ascending=False))   #将列逆序后并输出
'''
     F      E  D    C          B    A
0  foo   test  3  1.0 2013-01-02  1.0
1  foo  train  3  1.0 2013-01-02  1.0
2  foo   test  3  1.0 2013-01-02  1.0
3  foo  train  3  1.0 2013-01-02  1.0
'''
# print(df2.sort_index(axis=0, ascending=False))   #将行逆序后并输出
'''
     A          B    C  D      E    F
3  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
0  1.0 2013-01-02  1.0  3   test  foo
'''


#对数据 值 排序输出:
print(df2.sort_values(by='E'))   #按照E列的数值排序并输出
'''
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
2  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
3  1.0 2013-01-02  1.0  3  train  foo
'''


import pandas as pd
import numpy as np

dates = pd.date_range('20130101', periods=6)   #生成行号
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
# print(df)
'''
             A   B   C   D
2013-01-01   0   1   2   3
2013-01-02   4   5   6   7
2013-01-03   8   9  10  11
2013-01-04  12  13  14  15
2013-01-05  16  17  18  19
2013-01-06  20  21  22  23
'''
# print(df['A'])
# print(df.A)    #效果一摸一样
'''
2013-01-01     0
2013-01-02     4
2013-01-03     8
2013-01-04    12
2013-01-05    16
2013-01-06    20
Freq: D, Name: A, dtype: int64
'''

# print(df[0:3])  #选择第0,1,2行
'''
            A  B   C   D
2013-01-01  0  1   2   3
2013-01-02  4  5   6   7
2013-01-03  8  9  10  11
'''
# print(df['20130102':'20130104'])  #选择第1,2,3行
'''
             A   B   C   D
2013-01-02   4   5   6   7
2013-01-03   8   9  10  11
2013-01-04  12  13  14  15
'''

# print(df[3:3])  #df[3:3]是一个空对象
'''
Empty DataFrame
Columns: [A, B, C, D]
Index: []
'''
#  loc: select by label 
#  iloc: select by position
#同样我们可以使用标签来选择数据 loc, 本例子主要通过标签名字选择某一行数据, 或者通过选择某行或者所有行(:代表所有行)然后选其中某一列或几列数据。
# print(df.loc['20130102'])  #输出这一行的所有列
'''
A    4
B    5
C    6
D    7
Name: 2013-01-02 00:00:00, dtype: int64
'''
# print(df.loc[:,['A','B']])  #输出A列和B列的所有内容
'''
             A   B
2013-01-01   0   1
2013-01-02   4   5
2013-01-03   8   9
2013-01-04  12  13
2013-01-05  16  17
2013-01-06  20  21
'''
# print(df.loc['20130102',['A','B']])  #输出某一行某几列的内容
'''
A    4
B    5
Name: 2013-01-02 00:00:00, dtype: int64
'''

# print(df.iloc[3,:])   #打印第三行
'''
A    12
B    13
C    14
D    15
Name: 2013-01-04 00:00:00, dtype: int64
'''
# print(df.iloc[3,1])   #打印第三行第一列处的值
# 13

# print(df.iloc[3:5,1:3])  #打印第3,4行,第1,2列的内容,对df进行切片
'''
             B   C
2013-01-04  13  14
2013-01-05  17  18
'''

# print(df.iloc[[1,3,5],1:3])  #打印第1,3,5行,第1到2列的内容
'''
             B   C
2013-01-02   5   6
2013-01-04  13  14
2013-01-06  21  22
'''
#当然我们可以采用标签和位置混合选择 ix, 其中选择’A’和’C’的两列,并选择前三行的数据
# print(df.ix[:3,['A','C']])
'''
            A   C
2013-01-01  0   2
2013-01-02  4   6
2013-01-03  8  10
'''
#虽然能执行,但是出现了警告,ix的方式即将被废弃,请使用loc或者iloc的方式
'''
DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing
'''

#最后我们可以采用判断指令 (Boolean indexing) 进行选择. 我们可以约束某项条件然后选择出当前所有数据.
# print(df[df.A>8])    #打印A列所有大于8的元素所在的行
'''
             A   B   C   D
2013-01-04  12  13  14  15
2013-01-05  16  17  18  19
2013-01-06  20  21  22  23
'''

猜你喜欢

转载自blog.csdn.net/yj13811596648/article/details/83050238