数据分析基本操作
参考: link.
第一章
第一节加载数据
- 使用的库:pandas
- 使用的函数: pd.read_csv()、pd.read_excel、pd.read_table()
test = pd.read_csv('test_1.csv',index_col=0)
#设置Index_col为0,防止出现unnamed列
- tsv文件和csv文件
1.TSV 是Tab-separated values的缩写,即制表符分隔值。相对来说CSV,Comma-separated values(逗号分隔值)更常见一些
2.TSV是用制表符(Tab,’\t’)作为字段值的分隔符;CSV是用半角逗号(’,’)作为字段值的分隔符
3.当delimiter=’\t’时,被处理文件就是TSV - 读取数据
使用chunksize后,read_csv操作返回一个TextParser对象,每个chunk对象是一个dataframe对象
使用for循环打印出10块以chunksize为行数,列数为原始数据列数的datafrme格式的数据。 - 替换表头的名字,在read_csv中使用names=[]替换,索引为Index_col=[列名],header=0不保存原来的列名
- 查看数据的基本信息
info():打印信息,包括列名column,每列非空个数non_null count,类型dtype
describe():描述性数据,对数值型的列进行汇总
shape: 形状 (行数, 列数)
df.columns: 列标签 Index
df.columns.values:列标签 ndarray
df.index:行标签 Index
df.index.values:行标签 ndarray
df.head(n): 前n行
df.tail(n): 尾n行
第二节pandas基础
- pandas是基于numpy构建的,含有高级数据结构和操作工具
- pandas中有两种数据类型DataFrame和Series。
2.1 series
(一)定义
是一种类似于一维数组的对象,由一组数据以及一组与之相关的数据标签(索引)组成。series只有行索引,如果未指定索引,则是以数字自动生成.
obj=Series([4,7,-5,3])
print (obj)
>>>
0 4
1 7
2 -5
3 3
# 取值:
print(obj.values)
>>>
[ 4 7 -5 3]
#取出索引值
print (obj.index)
>>>
RangeIndex(start=0, stop=4, step=1)
#自定义索引
obj2=Series([4,7,-5,3],index=['d','b','a','c'])
prInt(obj2)
>>>
d 4
b 7
a -5
c 3
#可以通过索引的方式选择series中的单一或一组值
print obj2['a'] #输出结果:-5
print obj2['d'] #输出结是:4
(二)操作
- Series.order()进行排序,而DataFrame则用sort或者sort_index
- (1)Numpy数组运算(根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接
print obj2[obj2>0] #取出>0的值
#输出结果如下:
d 4
b 7
c 3
print obj2*2
#输出结果如下:
d 8 b 14
a -10
c 6
- (2)还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可以用在许多原来需要字典参数的函数中
print( 'b' in obj2) #obj2中有索引'b'?若有就返回'True'
- (3)如果数据被存在一个python字典中,也可以直接通过这个字典来创建Series
sdata={'Ohio':35000,'Texax':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
print obj3
#输出结果如下:
Ohio 35000
Oregon 16000
Texax 71000
Utah 5000
#注:如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)
states=['California','Ohio','Oregon','Texax']
obj4=Series(sdata,index=states) #将sdata字典创建Series,索引用states来创建
print obj4
#California在sdata中没有相应的值,故是NaN缺省值
California NaN
Ohio 35000.0
Oregon 16000.0
Texax 71000.0
2.2DataFrame
(一)定义
DataFrame是一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型。既有行索引也有列索引,可以被看做由series组成的字典。相当于表格,有行表头和列表头
a=pd.DataFrame(np.random.rand(4,5),index=list("ABCD"),columns=list('abcde'))
print(a)
>>>
(二)一些操作
# 增加列或修改列
a['f']=[1,2,3,4]
a['e']=10
#增加行或修改行
a.loc['D'] = 10
S=pd.DataFrame(np.random.rand(4,6),index=list('EFGH'),columns=list('abcdef'))
a=a.append(S) # 同一列进行拼接
#切片
a[['b','e']] #取'b','e'列
a.loc['A':'D',['a','c','f']] #取'A'-'D'行'a','c','f'列
a.loc[[100],['Pclass','Sex']]#loc取第100行的数据,行和列都要使用[],需要是列名
a.iloc[2,3]#取第三行第4列值
a.iloc[4,0]#取第五行第1列值设为None
#减少行或减少列
a=a.drop(['C','D']) #删除'C'行和'D'
a=a.drop('a',axis=1) #删除'a'列,axis=0表示行,axis=1表示列
a=a.drop('a',axis=1,inplace=False)#没有覆盖原先的数据,没有真的drop掉,默认是true
a=a.fillna(5) #缺省值处(即NaN处填充为5)
a=a.dropna() #删除缺省值为NaN的行
(三)构造DataFrame的方法
- 1.由等长列表或者Numpy数组组成的字典
data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
frame=DataFrame(data)
>>>
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
- 2.如果指定了列序列,则DataFrame的列就会按照指定的顺序进行排序
frame1=DataFrame(data,columns=['year','state','pop'])
>>>
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
- 3.跟Series一样,如果传入的列在数据中找不到,就会产生NA值
frame2=DataFrame(data,columns=['year','state','pop','debt'],
index=['one','two','three','four','five'])
>>>
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
- 4.类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
frame2['state']
>>>
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
Name: state, dtype: object
frame2.year
>>>
one 2000
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
(四)数据操作
#按照某一列筛选
test[test['Age']<10]
midage =test[(test['Age']<50) &(test['Age']>10)]
第三节探索性数据分析
3.1将数据按照某一列的值进行排序
data.sort_values(by='c',ascending=False or True)
#通过索引进行排序:
series.sort_index() #默认行索引,升序
#通过值进行排序:
series.sort_values() #默认升序
#dataframe根据行索引进行降序排序(排序时默认升序,调节ascending参数):'
frame.sort_index(ascending=False)
#dataframe根据列索引进行排序:
frame.sort_index(axis=1)
#dataframe根据值进行排序:
frame.sort_values(by='a')
#通过多个索引进行排序:
frame.sort_values(by=['a','c'])
3.2 算术运算
- 相加: 两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN
frame1_a + frame1_b
第二章
第一节数据清洗及特征处理
1.查看每一列缺失值个数
data.info()
data.isnull().sum()
2.对缺失值处理
data[data['Age']==None] = 0
data[data['Age'].isnull()]=0
data[data['Age']==np.nan]=0
data.dropna()
data.fillna(0)
3.查看重复值
data[data.duplicated()]
data.drop_duplicates()
4.连续数据离散化
分箱处理
data['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
5.对文本变量进行转换
查看文本变量名及种类
df['Sex'].value_counts()
df['Sex'].unique()
df['Sex'].nunique()
将类别文本转换
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
多个变量转换,使用sklearn
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
第二节数据重构
1.merge、concat、join、append的用法
merge和concat是pandas中得用法;join和append是python自带的
merge和join不能进行纵向合并,即不能做到增加行;而append不能进行横向合并,即不能增加列
merge
使用merge合并时,两个数据集的合并条件必须是类型一致,默认是内连接,也可以选择left,right,outer等方式
pd.merge(df1,df2,on='',how='')
pd.merge(df1,df2,left_on='',right_on='',how='')
concat
合并两个数据集,可在行或者列上合并(用axis调节,默认axis=0)
pd.concat([df1,df2])#默认纵向合并
pd.concat([df1,df2],axis=1) #横向合并
join
索引上的合并,是增加列不是增加行,当合并的数据表列名字相同,通过lsuffix和rsuffix区别相同列名,列名不能重合
data=df1.join(df2,how='outer',lsuffix='_1',rsuffix='_2')
append
增加行
data= df1.append(df2,ignore_index=True)
2.stack()函数
将dataframe格式的数据转换为series格式
data.stack()