1、导入两个数据分析重要的模块
import numpy as np
import pandas as pd
2、创建一个时间索引,所谓的索引(index)就是每一行数据的id,可以标识每一行的唯一值
dates = pd.date_range('20161024',periods=6)
3、创建一个6X4的数据:randn函数用于创建随机数,参数表示行数和列数,dates是上一步创建的索引列
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
4、使用字典来创建数据框,例如创建一个列名为A的数据框,索引不加则是自动创建的整数
例子1:df = pd.DataFrame({'A':np.random.randn(6)})
例子2:df = pd.DataFrame({'A':pd.Timestamp('20161024'),'B':pd.Series(1)})
假如字典内的数据长度不同,以最长的数据为准,比如B列有4行
df = pd.DataFrame({'A':pd.Timestamp('20161024'),'B':pd.Series(1,index=list(range(4)))})
5、查看数据
print(df.dtypes) #查看数据格式
print(df) #查看所有数据
print(df.head()) #查看指定前几行的数据,默认是前5行
print(df.tail()) #查看指定前几行的数据,默认是后5行
print(df.index) #查看数据索引
print(df.columns) #查看数据列名
print(df.values) #查看数据值
print(df.describe) #查看描述性统计
6、使用T来转置数据,也就是行列转换
print(df.T)
7、对数据进行排序,用到了sort,参数可以指定根据哪一列数据进行排序。
df = pd.DataFrame({'A':(22,44,33,11),'B':(111,222,333,444)})
print(df.sort(columns='A'))
8、数据的选择,选择数据就是用到了切片和loc、at方法
df['A'] 选择A列的操作
df[1:3] 还可以使用数组的切片操作,但是注意了,切片得到的是行数据,如果你想使用这个方法得到列,那就会出现错误
df['20161026':'20161028'] 可以使用行标签来指定输出的行,类似于切片
df.loc[dates[0]] DataFrame的loc方法是帮助选择数据的,比如选择索引位置为0的一行数据(注意我们是用dates作为索引的)
df.loc[:,['A','B']] 选择多列数据的写法
df.loc['20161026':'20161028',['A','B']] 选择局部数据,是行和列的交叉区域
df.loc[dates[0],'A'] 只选择某一个数据,可以指定行和列
df.loc[dates[0],'A'] at方法是专门用于获取某个值的
9、DataFrame切片操作
df.iloc[3] 使用iloc方法,提取第四行数据
df.iloc[3:5,0:2] 返回4-5行,1-2列数据
df.iloc[[1,2,4],[0,2]] 可以提取不连续行和列的数
df.iloc[1:3,:] 提取某一样或者某几行的数据,保证所有列都在,可以使用一个冒号来表示所有列
df.iloc[:,1:3] 所有行,也可以用冒号来表示
df.iloc[1,1] 提取某一个值,去掉所有冒号,比如取第2行第2列的这个数
df.iat[1,1] iat是专门提取某个数的方法,它的效率高更高,因此建议在提取单个数的时候用iat
10、Dataframe筛选数据
df[df.D>0] 筛选D列数据中大于0的行
df[(df.D>0)&(df.C<0)] 使用&符号可以实现多条件筛选,当然是用"|"符号也可以实现多条件,只不过他是或的关系。
df[['A','B']][(df.D>0)&(df.C<0)] 我们只需要A和B列数据,而D和C列数据都是用于筛选的,可以这样写:只返回了AB两列数据
可以使用insin方法来筛选特定的值:
alist = [0.05397,0.687087,0.36545]
print(df['D'].isin(alist))
11、单列数据格式的转换
df = pd.read_csv('000917.csv',encoding='gbk')
df = df[df['涨跌幅']!='None']
df['涨跌幅'] = df['涨跌幅'].astype(np.float64)
print(type(df.loc[2,'涨跌幅']))
12、统计名称的个数
df = pd.read_csv('000917.csv',encoding='gbk')
df = df[df['涨跌幅']!='None']
df['涨跌幅'] = df['涨跌幅'].astype(np.float64)
t = df['名称'].value_counts()
print(t)
##电广传媒 3519
##G 电 广 193
##电广实业 158
##Name: 名称, dtype: int64
12、操作多索引MultiIndex
# -*- coding: utf-8 -*- import os import pandas as pd import numpy as np #建立一个带二重索引的DataFrame df = pd.DataFrame() df['a'] = list(range(10,30,2)) df['b'] = df['a'] // 10 df.index.name = 'id' df = df.set_index([df['b'],df.index],drop=False) #对带多重索引的dataframe取值一般使用xs df = df.xs(1,level='b') #选取第一级b=2,id=6 #df.xs((2,6)) #使用PD.IndexSlice可以更花式的 #这里因为使用的是loc,所以返回的是引用,可以修改原值 #IndexSlice中,每一级的index都要有对应的取值,全取则用”:” #idx['b','id'] #idx = PD.IndexSlice #df.loc[idx[:,[1,3,8]],'a'] print(df)
13、数据分组,数据分组的好处是你可以一次性计算得到所有分组中的统计量,比如想计算男女学生的平均成绩分别是多少
grouped = df.groupby('A') 对A列进行分组
grouped = df.groupby(['A','B']) 对A列和B列同时进行分组
14、字符串操作
s = pd.Series(list('ABCDEF'))
print(s.str.lower()) 转换小写
print(s.str.upper()) 转换大写
print(s.str.len()) 求长度
s = pd.Series(['a_b_c','c_a_b',np.nan,'f_g_h']) 切割字符串,转换成list
print(s.str.split('_'))
print(s.str.split('_').str.get(1)) 使用get方法获得列中的某个元素
print(s.str.replace('^a|b$','X',case=False)) 使用replace,replace的第一个参数是正则表达式,第二个参数是要替换成的字符串。
14、字符串提取数据
s = pd.Series(['a1','a2','b1','b2','c3','c'])
print(s.str.extract('[ab](d)')) 提取一个
print(s.str.extract('([abc])(d)')) 提取多个
print(s.str.extract('([abc])(d)?')) 你要灵活使用问号,它表示可有可无,下面的方式可以匹配字符“c”
s.str.extract('(?P<letter>[abc](?P<digit>d)') 输出的结果包含变量名(列名)
15、填充缺失值
df.fillna(0) 使用0替代缺失值
df.fillna('missing') 用一个字符串代替缺失值
df.fillna(method='pad') 用前一个数据代替NaN:method='pad'
df.fillna(method='bfill',limit=1) 用后一个数据代替
df.fillna(df.mean()) 使用平均数或者其他描述性统计量来代替NaN
df.fillna(df.mean()['one','two']) 可以选择哪一列进行缺失值的处理
16、删除缺失数据
df.dropna(axis=0) 选择删除行,使用参数axis=0,这是最常用的方法
df.dropna(axis=1) 选择删除列
17、值替换
df.replace(0,6) 将0替换为6
df.replace([0,1,2,3,4,5],[5,4,3,2,1,0]) 列表到列表的替换
df.replace({1:11,2:12}) 使用字典映射:将1替换为11,将2替换为12
方法可以用在列上