Python数据分析入门学习笔记
Pandas和Numpy
pandas和numpy都是数据分析中经常用到的库两者功能上有许多不同.
pandas和numpy都是科学计算包
Numpy擅长处理多维数组和矩阵,它常见用于数据分析方向.
Pandas是一个以数据分析而创建的模块,以Numpy为基础,内含许多类和标准化的数据模型和函数.能帮我们高效快速地处理数据集,因此是大数据和机器学习的根基
Numpy在多维数组的应用
运算
数组本身的运算
例1.
data = [1,2,3,4,5,6]
x = np.array(data)#使用列表生成数组
print(x)#打印数组
print(x.dtype)#数组的数据元素的类型
print(x.ndim)#维度的个数
print(x.shape)#各个维度的大小
print(x*2)#数组乘
print(x>2)#数组判断
[1,2,3,4,5,6]
int64
1
(6,)
[2,4,6,8,10,12]
[true,false,false,false,false,false]
两数组之间的运算
numpy两个数组间的运算能直接进行,数组的运算参考线性代数.
例2.
# np.add 这是一个相加函数
data1 = np.array([[1.1,2],[3,4.1],[5.2,6]])
data2 = np.array([[3.1,5],[6,4],[9.8,3]])
print(data1+data2)
print(np.add(data1, data2))
[[ 4.2 7. ]
[ 9. 8.1]
[ 15. 9. ]]
[[ 4.2 7. ]
[ 9. 8.1]
[ 15. 9. ]]
索引
索引的意思也就是查找,就是准确地查找到数组的某个位置的数据.
例3.
#对数组进行乘法和布尔判断运算
x = np.array([1,2,3])
print(x*2)
print(x>2)
[1 2]
2
2
切片
numpy和pandas都是可以切片的,numpy的切片是连续的,pandas可以进行不连续切片.
numpy切片的过程是从第一个想要的对象到最后一个不想要的对象之前的连续的对象就是最后得到的对象.
相当于是一个左闭右开区间.
接下来是一个具体的例子可以用来理解.
例4.
x = np.array(np.arange(1,9,1))
print(x)
print(x[1:3]) # 右边开区间
print(x[:3]) # 左边默认为 0
print(x[1:])# 右边默认为元素个数
print(x[0:7:2]) #下标递增2
[1 2 3 4 5 6 7 8]
[2 3]
[1 2 3]
[2 3 4 5 6 7 8]
[1 3 5 7]
其他功能
numpy也有重塑和转置数组的功能
x = np.arange(12).reshape(2,3,2).其中(维度数,每个维度的对象个数,递增的跨度),每个参数的意义,其中每个参数相乘最后要等于对象的总个数.
转置函数就是T或者swapaxes.转置后的效果相当于数组的转置,参考线性代数.
Pandas
文件读取
首先导入 pandas 并命名。import padans as pd
文件读取的函数是 pd.read_csv,这代表读取一个文本格式的数据。
读取文件
在Pandas中读取文件,如果文件和代码文件不在同一个文件夹下面,需要输入文件的具体路径.
例1.
import pandas as pd
NACIS2016= pd.read_csv('NACIS2016.csv')
读取文件的部分
例2.
#head函数将帮你调取出前五行数据以便观察这个数据的行列信息
NACIS2016.head()
索引和切片
pandas和numpy有的索引和切片非常的相似,但是比numpy多一些拓展的功能比如说可以进行不连续切片.
pandas的切片和索引有两个函数loc和iloc.
loc函数
loc 函数根据行标的内容进行索引.通过行标签索引行数据.
NACIS2016.loc[0]#loc[0]表示索引的是第1行(index 是整数)
data = [[1,2,3],[4,5,6]]
index = ['d','e']
columns=['a','b','c']
df = pd.DataFrame(data=data, index=index, columns=columns)#loc也可以接受str标签
loc函数同样可以切片,方法跟numpy一样.
iloc函数
iloc 以行所处的位置,也就是行号为基础进行索引,其中的 i 代表 integer,说明这个函数只接受数字。因此,我们要获取哪一行的信 息,就填入那一行对应的数字.iloc不支持str字符,会报错.
loc和iloc对比
例3.
print(NACIS2016.loc[:3, ['Kind of Business','Jan. 2016']])
print(NACIS2016.iloc[:3 , [1,2]] )
Kind of Business Jan. 2016
0 Motor vehicle and parts dealers 92341
1 Automobile and other motor vehicle dealers 84678
2 Automotive parts, acc., and tire stores 7663
3 Furniture, home furn, electronics, and applian... 17426
Kind of Business Jan. 2016
0 Motor vehicle and parts dealers 92341
1 Automobile and other motor vehicle dealers 84678
2 Automotive parts, acc., and tire stores 7663
总结:loc是根据行标签索引,所以并不遵守左闭右开的规则,而iloc是根据行位来搜索,所以符合python的左闭右开区间.
数据合并
用pandas讲数据合并的时候有三种方法:merge,concat,join.
由于merge和join方法几乎一样,所以这里只讲一下merge和join.
合并方式:
1.inner join(取交集)
2.outer jion(取并集)
3.left jion(向左合并)
4.right jion(向右合并)
merge
merge有两种用法,一种是用左表调用 merge:DataFrame.merge(right, how=‘inner’, on=None, left_on=None, right_on=None),另一种是用pandas 调用 merge:pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None)
DataFrame:DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。
或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matlab也可以用cell存放多类型数据),DataFrame的单元格可以存放数值、字符串等,这和excel表很像。
同时DataFrame可以设置列名columns与行名index,可以通过像matlab一样通过位置获取数据也可以通过列名和行名定位
print(NACIS2016_subset.merge(NACIS2017_subset, how='inner', on = ['NAICS Code']))#第一种方法
print(pd.merge(NACIS2016_subset, NACIS2017_subset, how='inner', on = ['NAICS Code']))#第二种方法
concat
Merge 的拼接是横向的,concat 则默认纵向拼接,同时可以设成横向 拼接。但 concat 的横向拼接不如 merge 那么好,所以我们用 concat 主要是纵向拼接。
其语法格式为:pd.concat(objs, axis=0, join=‘outer’)。第一位 是要拼接的数据表格组成的列表,第二位是以什么为轴来拼接,0 是 以行为轴,1 是以列为轴,默认值 0,第三位是合并方式。
pd.concat(objs, axis=0, join=‘outer’)
objs: series,dataframe或者是panel构成的序列lsit
axis: 需要合并链接的轴,0是行,1是列
join:连接的方式 inner,或者outer
#纵向拼接,列名需要一样
df1 = pd.DataFrame({'a':[1, 2, 3],
'b':[1, 2, 3],
'c':[1, 2, 3]})
df2 = pd.DataFrame({'a':[1, 2, 3],
'b':[1, 2, 3],
'c':[1, 2, 3]})
df3= pd.DataFrame({'a':[1, 2, 3],
'b':[1, 2, 3],
'c':[1, 2, 3]})
frames = [df1, df2, df3] # 现将表构成list,然后在作为concat的输入
pd.concat(frames)
a b c
0 1 1 1
1 2 2 2
2 3 3 3
0 1 1 1
1 2 2 2
2 3 3 3
0 1 1 1
1 2 2 2
2 3 3 3
横向拼接NACIS2016_subset, NACIS2017_subset,保留NACIS2016_subset,NACIS2016_subset全部行
frames = [NACIS2016_subset, NACIS2017_subset]
pd.concat(frames, axis=1, join='outer')
横向拼接,concat不如merge方便,且功能局限