Python数据科学之Pandas入门
pandas主要用来做数据的分析和处理。Series数据序列,Dataframe数据框
Series的创建
方一
方二
方三:字典的方式
指定Series的index
获取值:s4['A']--->1
把Series转换为字典
换index
判断Series中有素为空的
pd.isnull(s5)和pd.notnull(s5)
DataFrame
复制成的dataframe
获取列名:df.columns.
获取其中一列
或者df['Sep 2016']
获取其中几列
赋值
深入Series和DataFrame
可以把字典转换为DataFrame
一个DataFrame是由多个Series组成
由Series来创建DataFrame
df_new.T转置
df_new和df1可以发现df_new有颠倒 ---》采用df_new.T转置
import pandas as pd
import numpy as np
s = pd.Series([1,2,3,4])
s
2.1查看索引:
s.index
2.2查看值:
s.values
2.3和numpy array比较:
np.array([1,2,3,4])
重点: 发现Series的values转化出来就是numpy array
2.4通过序号取值
s[1]
问题: 这里的序号是不是索引呢?我们想办法改变索引,然后继续通过序号查询试试。
s.index = ['a','b','c','d']
s
s.index
s[1]
s.index = [7,8,9,10]
s
s.index
s[7]
重点: Series是有序的,Series默认的索引是从0开始的数字。如果要重置索引,分两种情况: 1.重置成字符串索引:通过字符串和默认的索引都能访问到值 2.重置成数字索引:会把默认索引覆盖掉,只能通过重置后的索引访问值。
2.5通过索引取值
s.index = ['a','b','c','d']
s['c']
2.6新建Series时指定索引
s2 = pd.Series(np.arange(3),index=['x','y','z'])
s2
问题: np.arange(3)是什么呢?
np.arange(3)
执行发现是numpy定义自增的数组。
再来几个numpy arange复杂点的用法如下:
np.arange(3,7)
执行发现定义定是3到7之间不包含7的数组。
np.arange(3,7,2)
执行发现定义定是3到7之间不包含7的数组,并且步长是2。实际api解释的很清楚来,[想看api戳这里。](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html)
再来两个验证一下:
np.arange(3,9,2)
np.arange(3,9,3)
解析:[3,9)之间;递增2,结果为3,5,7;递增3,结果为3,6。
2.7新建Series时不指定索引,通过dictionary定义(dict没有顺序)
s3 = pd.Series({'b':1.212,'a':2.113,'c':3.114,'d':4.445})
s3
解析:发现series会根据索引首字母帮我们默认排序。
2.8 Series数据批处理
s3 * 1000
s3
解析:发现原本series并没有变化,证明在内存中是数据拷贝。
s3 = s3 * 1000
s3
解析:通过指向改变原始数据集。
2.9series取出部分数据
s3[['a','c']]
解析:通过['a','c']集合,所以在集合索引中的数据。
问题: 变换索引顺序,会是什么结果呢?
s3[['c','a','d','b']]
s3[['a','c']]
解析:发现结果是根据索引顺序有序展示的。
2.10通过查询条件取出series部分数据
s3[s3 > 2000]
问题: s3 > 2000返回的是什么呢?执行一下:
s3 > 2000
解析:series会将满足条件的数据筛选出来,有点类似sql。
问题:返回的结果到底是按照什么顺序返回的呢?举个特殊的例子试试
s4 = pd.Series({'b':1,'a':5,'d':4,'e':3,'c':2})
s4
s4[s4 > 2]
解析:series还是按照字母排序后的索引顺序返回。
2.11series高级用法
s3.mean()
一个函数求出平均值,感觉dd的。
s5 = s3[['a','b']]
s5
s6 = s3[['b','d']]
s6
s5 + s6
解析:这里的结果是不是和大家想的不一样,看结果发现series实际上是通过index相加,找不到相同index的相加为NaN,等于取交集。
3.1通过dict定义df 字典定义DataFrame
data = {
'simon': [94,2,17],
'skyamz' : ['haha','hehe','heihei'],
'memoryjdch':['beijing','shanghai','hangzhou']
}
umi = pd.DataFrame(data)
umi
解析:df默认也会像series一样进行首字母排序。
umi.index
解析:df纵轴为索引。
umi.columns
解析:df横轴为列名。
umi.dtypes
解析:df查看每个column的类型。
umi.info()
解析:查看df信息。
umi.values
解析:转化成了numpy 多纬数组。
3.2设置某列值为df索引
umi = umi.set_index('skyamz')
umi
解析:以前的数字索引被skyamz列的值替换。
umi
umi['simon']
解析:获取某列,这一竖列就是一个series。
umi['memoryjdch'] + "-" + (umi['simon']/100).astype('str')
解析:多列操作,注意类型。
umi = umi.reset_index()
umi
解析:重置索引。
umi['heihei'] = umi['memoryjdch'] + "-" + (umi['simon']/100).astype('str')
umi
解析:通过计算的数据新建列,这也是特征提取的过程。
umi[umi['simon'] > 2]
解析:类似series筛选部分数据。
umi.sort_values(by = 'simon',ascending = False)
umi.sort_values(by = 'simon',ascending = True)
解析:对df进行排序,by 排序的字段,ascending是否升序排列。
umi.drop([0], axis = 0)
umi
umi.drop(['heihei'], axis = 1)
解析:对df进行删除操作,axis指定删除操作,0为行,1为列。
umi.describe()
解析:df的基础统计信息。
umi[['simon','memoryjdch']]
解析:df取出多列。
umi[1:3]
umi[:2]
解析:df取行,[1:3]意义是[1,3)为索引1,2,[:2]意义为[0,2)为索引0,1。
%matplotlib inline
umi.plot()
解析:matplotlib是最著名的Python图表绘制扩展库,它支持输出多种格式的图形图像,并且可以使用多种GUI界面库交互式地显示图表。使用%matplotlib命令可以将matplotlib的图表直接嵌入到Notebook之中,或者使用指定的界面库显示图表,它有一个参数指定matplotlib图表的显示方式。inline表示将图表嵌入到Notebook中。
umi['simon'].plot(kind = 'bar')
解析:取出df部分数据进行绘制,kind指定图形类型,bar为柱状图。
umi['present'] = [100,90,80]
umi.plot(kind = 'scatter',x ='simon' , y ='present')
解析:取出df多列数据进行绘制,kind指定图形类型,x指定x轴,指定x轴。
umi
umi.loc[1,'simon']
解析:搜索索引为1,列名为simon的单元格内容。
umi.loc[0:2 , :]
umi.loc[:]
umi.loc[: , ['memoryjdch','skyamz']]
umi.loc[0:2 , ['memoryjdch','skyamz']]
umi.loc[umi['simon']>2,['memoryjdch','simon','skyamz']]
解析:通过索引和列同时查询单元格内容。
umi
umi.iloc[0:2 , 1:3]
解析:索引和列名都通过序号查询
del umi['present']
umi
解析:del直接就删除列,不需要重复指向,注意和drop的区别。
user_data = {
'uid':[1,2,3,4,5,6],
'name' : ['nike','lining','qiaodan','xiaohong','xiaoming','zhouxingxing'],
'age': [24,20,17,22,18,15],
'sex':[0,1,0,1,1,0],
'birth_day':['2011-10-2 12:23:22','2012-01-2 13:33:22','2001-11-2 12:23:22','2014-05-2 12:23:22','2008-09-2 12:23:22','2011-10-2 12:23:22']
}
user = pd.DataFrame(user_data)
user
user.head()
解析:查看user的前5条数据。
to_view = [col for col in user.columns if 'a' in col]
to_view
解析:
1.user.columns表示user这个dataframe中的所有列。
2.for col in user.columns表示遍历所有列。
3.if 'a' in col表示判断该列是否包含a。
总结:[col for col in user.columns if 'a' in col]表示取出所有列名中包含a的所有列。
user[to_view]
column_count = sum (1 for col in user.columns if 'a' in col)
column_count
解析:
1.user.columns表示user这个dataframe中的所有列。
2.for col in user.columns表示遍历所有列。
3.if 'a' in col表示判断该列是否包含a。
总结:sum (1 for col in user.columns if 'a' in col)表示遍历所有列名中包含a的列,满足条件计数+1,然后返回统计总数。
user
cols = user.columns.tolist()
cols
cols[-1:]
解析:-1是指数组中的最后一个元素。可以理解为:将切片指针的位置从数组尾部前移1位进行切片,cols[-1:]中:右侧是缺省值,默认到尾部,从最后一个元素到尾部,即取最后一个元素。
下面是几个例子:
cols[-2:]
cols[-4:-2]
cols[-1]
cols[-2]
cols[-2:len(cols)]
cols = cols[-1:] + cols[:-1]
cols
cols
user = user[cols] # OR df = df.ix[:, cols]
user
解析: 1.cols = user.columns.tolist()将列名取出转为list。 2.cols = cols[-1:] + cols[:-1]:cols[-1:]指最后一列,cols[:-1]指从第一列到倒数第二列。用“+”连接两部分,此操作将第最后一列变为第一列。 3.user = user[cols]根据新的cols重塑dataframe。
code1是code2的语法糖写法,按照sex列进行分组,分好后对age列(单列)取平均。返回数组:
user.groupby('sex')['age'].mean()#code1
user['age'].groupby(user['sex']).mean()#code2
code3是code4的语法糖写法,按照sex列进行分组,分好后对age列(单列)取平均。返回dataframe:
user.groupby('sex')[['age']].mean()#code3(!)
user[['age']].groupby(user['sex']).mean()#code4
多列语法糖写法:按照sex列进行分组,分好后分别对age列和uid列(多列)取平均。code6这种写法是错误的!code7是code8的语法糖写法。
user.groupby('sex')['uid','age'].mean()#code5(!)
user['uid','age'].groupby(user['sex']).mean()#code6
user.groupby('sex')[['uid','age']].mean()#code7
user[['uid','age']].groupby(user['sex']).mean()#code8
速记口诀:单列双括号(code3),双列单括号(code5)。
3.3pandas导入导出文件
data = pd.read_csv('initdata/t_user.csv')
data
解析:读取文件通过read_*方法,这里是通过csv读取数据。
data.to_json('t_data.json')
解析:读取dataframe通过to_*方法,这里是导出为json数据。