动手学数据分析 Task 1
一、数据加载
项目源数据请见 kaggle。
1.对于csv中的数据,pandas库提供两种方法来读取,分别为:read_csv()和read_table()。二者的区别为:read_table()以制表符 \t 作为数据的标志,也就是以行为单位进行存储;而read_csv()则是按csv file 中的每一格为单位进行存储。
读取数据时最好使用绝对地址。如果要用相对地址却又不知道当前工作目录,则可以用下面的方法获得:
import os
print(os.getcwd());
2.有时源数据较大,则可以通过逐块读取的方法将数据分类。主要方法有以下两种:
(1)读取文件中前部分
通过nrows参数,来设置读取文件的前多少行,nrows是一个大于等于0的整数。
data = pd.read_csv("data.csv",nrows=5)
(2)逐块读取文件
#设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("data.csv",chunksize=5)
for piece in chunker:
print(type(piece))
#<class 'pandas.core.frame.DataFrame'>
print(len(piece))
#5
3.初步观察数据。常用的函数有以下几种:
df.info() #返回每列非空数据的个数以及数据类型
df.head(x) #返回前x行数据,x为正整数
df.tail(x) #返回倒数前x行数据,x为正整数
df.describe() #返回每列数据的数量、均值、方差、最大值、最小值、分位数
二、Pandas基础
最常用的查询方法有loc和iloc。loc通过行索引 “Index” 中的具体值来取行数据;iloc中的i意为integer,它通过行号来取行数据,因此iloc的参数只能是非负整数或者非负区间。
在下面这个例子中,我们创建了一个midage Dataframe,然后从这个表中取出了索引为100的行和绝对位置排在第100位的行。
midage = df[(df["Age"]>10)& (df["Age"]<50)]
print(midage.loc[100])
#######
PassengerId 101
Survived 0
Pclass 3
Name Petranec, Miss. Matilda
Sex female
Age 28
SibSp 0
Parch 0
Ticket 349245
Fare 7.8958
Cabin NaN
Embarked S
#######
print(midage.iloc[100])
#######
PassengerId 150
Survived 0
Pclass 2
Name Byles, Rev. Thomas Roussel Davids
Sex male
Age 42
SibSp 0
Parch 0
Ticket 244310
Fare 13
Cabin NaN
Embarked S
#######
三、探索性数据分析
1、排序
可以使用sort_index()和sort_values() 。
frame = pd.DataFrame(np.random.rand(12).reshape((3, 4)), index=['2', '1','3'], columns=['d', 'a', 'b', 'c'])
print(frame.sort_index(axis=0,ascending=TRUE) #按行索引升序排序
print(frame.sort_index(axis=1,ascending=FALSE) #按列索引降序排序
print(frame.sort_values(by=['a','d'],ascending=TRUE) #按a列和d列的值升序排列。这里先按a列排,遇到a列相同,再按d列排
2、算术运算
两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值 NaN。
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3), columns=['a', 'b', 'c'], index=['one', 'two', 'three'])
frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3), columns=['a', 'e', 'c'], index=['first', 'one', 'two', 'second'])
print(frame1_a )
print(frame1_b )
print(frame1_a+frame1_b )
###
result:
a b c
one 0.0 1.0 2.0
two 3.0 4.0 5.0
three 6.0 7.0 8.0
a e c
first 0.0 1.0 2.0
one 3.0 4.0 5.0
two 6.0 7.0 8.0
second 9.0 10.0 11.0
a b c e
first NaN NaN NaN NaN
one 3.0 NaN 7.0 NaN
second NaN NaN NaN NaN
three NaN NaN NaN NaN
two 9.0 NaN 13.0 NaN
3、筛选出姓名中含有‘Mr.’的数据
#使用str.contains()
print(df[df['Name'].str.contains(r'Mr\.')]['Name'])
#使用正则表达式
print(df['Name'].str.extract('(\D*)Mr\.(\D*)'))
4、查找age列的缺失值
print(df[df['Age'].isnull().values==True])
5、查看95%分位数
print(df[['Age','Fare']].quantile(0.95))