第一章:数据载入及初步分析
1.1载入数据
1.1.1导入pandas和numpy
import numpy as np
import pandas as pd
简单来说,numpy是用来处理N维数组(线性代数)问题的工具,pandas是一个数据分析工具。这两个也是数据分析中最主要的工具。
1.1.2 载入数据
载入数据的路径有两种表达方式,相对路径和绝对路径,但都需要用到pd.read_代码,本章我们使用的数据是csv格式,所以载入数据的代码就是pd.read_csv
由于一些未知因素,我没有办法在jupyter里通过相对路径载入数据,但是其他编辑器里可以,这里为了不影响代码的整体工作,直接写成注释pass了。
df=pd.read_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/train.csv')
df.head(3)
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
绝对路径载入数据。
【总结】 1.载入数据一般是通过pd.read_文件格式载入 2.csv(Comma-Separated-Values):是使用逗号(或其他分隔符号)分隔,以纯文本形式储存数据的一种文件。纯文本意味着其中存在编码和解码问题。Excel在读取csv文件时会先识别BOM,BOM标识了这份文档是用什么编码的,而utf-8编码是直接忽略BOM的,所以在python中用encoding=(‘utf-8’)输出的csv文件是没有BOM的,此时Excel打开会出现乱码。一种解决方法是使用utf_8_sig编码。
1.1.3 数据分块
reader = pd.read_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/train.csv', chunksize=500)
for chunk in reader:
print(chunk.head(3))
PassengerId Survived Pclass \
0 1 0 3
1 2 1 1
2 3 1 3
Name Sex Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
PassengerId Survived Pclass Name Sex \
500 501 0 3 Calic, Mr. Petar male
501 502 0 3 Canavan, Miss. Mary female
502 503 0 3 O'Sullivan, Miss. Bridget Mary female
Age SibSp Parch Ticket Fare Cabin Embarked
500 17.0 0 0 315086 8.6625 NaN S
501 21.0 0 0 364846 7.7500 NaN Q
502 NaN 0 0 330909 7.6292 NaN Q
篇幅有限,只展示前三项(.head(3)的意思就是前三项),可以看到chunksize=500将数据分块,每一块是500行,且chunk的类型是dataframe。 在处理大文件时,有可能会导致内存溢出且十分耗时,用chunk分块并配合for或while方法可以分快处理数据,防止占用过多内存。
1.1.4 更改表头
df = pd.read_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head(3)
| 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
乘客ID | | | | | | | | | | | |
---|
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
index_col=‘索引列’,这是在规定索引列;header=行数,这是在规定新的表格从第几行开始读取数据。
1.2 初步观察数据
1.2.1 查看数据基本信息
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 1 to 891
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 是否幸存 891 non-null int64
1 仓位等级 891 non-null int64
2 姓名 891 non-null object
3 性别 891 non-null object
4 年龄 714 non-null float64
5 兄弟姐妹个数 891 non-null int64
6 父母子女个数 891 non-null int64
7 船票信息 891 non-null object
8 票价 891 non-null float64
9 客舱 204 non-null object
10 登船港口 889 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 83.5+ KB
1.2.2 观察前几行和后几行的数据
df.head(10)
| 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
乘客ID | | | | | | | | | | | |
---|
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
---|
5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
---|
6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
---|
7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54.0 | 0 | 0 | 17463 | 51.8625 | E46 | S |
---|
8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.0750 | NaN | S |
---|
9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 27.0 | 0 | 2 | 347742 | 11.1333 | NaN | S |
---|
10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) | female | 14.0 | 1 | 0 | 237736 | 30.0708 | NaN | C |
---|
df.tail(10)
| 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
乘客ID | | | | | | | | | | | |
---|
882 | 0 | 3 | Markun, Mr. Johann | male | 33.0 | 0 | 0 | 349257 | 7.8958 | NaN | S |
---|
883 | 0 | 3 | Dahlberg, Miss. Gerda Ulrika | female | 22.0 | 0 | 0 | 7552 | 10.5167 | NaN | S |
---|
884 | 0 | 2 | Banfield, Mr. Frederick James | male | 28.0 | 0 | 0 | C.A./SOTON 34068 | 10.5000 | NaN | S |
---|
885 | 0 | 3 | Sutehall, Mr. Henry Jr | male | 25.0 | 0 | 0 | SOTON/OQ 392076 | 7.0500 | NaN | S |
---|
886 | 0 | 3 | Rice, Mrs. William (Margaret Norton) | female | 39.0 | 0 | 5 | 382652 | 29.1250 | NaN | Q |
---|
887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
---|
888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
---|
889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
---|
890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
---|
891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
---|
1.2.3判断数据是否为空
df.isnull().head(5)
| 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
乘客ID | | | | | | | | | | | |
---|
1 | False | False | False | False | False | False | False | False | False | True | False |
---|
2 | False | False | False | False | False | False | False | False | False | False | False |
---|
3 | False | False | False | False | False | False | False | False | False | True | False |
---|
4 | False | False | False | False | False | False | False | False | False | False | False |
---|
5 | False | False | False | False | False | False | False | False | False | True | False |
---|
其中False表示非空True表示空。
1.3 保存数据
1.3.1 将更改后的数据输出到文件
df.to_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/train_chinese.csv', encoding = 'utf_8_sig')
1.4 数据类型
1.4.1 DataFrame和Series
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
example_1
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
example_2
| state | year | pop |
---|
0 | Ohio | 2000 | 1.5 |
---|
1 | Ohio | 2001 | 1.7 |
---|
2 | Ohio | 2002 | 3.6 |
---|
3 | Nevada | 2001 | 2.4 |
---|
4 | Nevada | 2002 | 2.9 |
---|
5 | Nevada | 2003 | 3.2 |
---|
Series可以看作是从一个一维空间到另一个一维空间的双射,DataFrame则是从一个多维空间到一维空间的双射,DATaFrame可以分成许多Series来观察。
1.4.2简单分析数据
df = pd.read_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/train_chinese.csv')
df.columns
Index(['乘客ID', '是否幸存', '仓位等级', '姓名', '性别', '年龄', '兄弟姐妹个数', '父母子女个数', '船票信息',
'票价', '客舱', '登船港口'],
dtype='object')
.columns为显示列名称。
df['客舱'].head(3)
0 NaN
1 C85
2 NaN
Name: 客舱, dtype: object
df.客舱.head(3)
0 NaN
1 C85
2 NaN
Name: 客舱, dtype: object
df[‘列名称’]和df.列名称为显示这列的数据。
1.4.3简单数据处理
引入新数据集test_1,删除多余列。
test_1 = pd.read_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/test_1.csv')
test_1.head(3)
| Unnamed: 0 | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | a |
---|
0 | 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S | 100 |
---|
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | 100 |
---|
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S | 100 |
---|
del test_1['a']
test_1.head(3)
| Unnamed: 0 | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|
0 | 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
1.4.4隐藏列
df.drop(['乘客ID','姓名'],axis = 1).head(3)
| 是否幸存 | 仓位等级 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 1 | 1 | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 1 | 3 | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
.drop表示隐藏,axis = 1表示隐藏列名称, axis = 0表示隐藏行名称 加入implace = True即可完全删除数据结构
1.5筛选
1.5.1 按照列的范围筛选数据
youngage = df[df['年龄']<10]
youngage.head(3)
| 乘客ID | 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.075 | NaN | S |
---|
10 | 11 | 1 | 3 | Sandstrom, Miss. Marguerite Rut | female | 4.0 | 1 | 1 | PP 9549 | 16.700 | G6 | S |
---|
16 | 17 | 0 | 3 | Rice, Master. Eugene | male | 2.0 | 4 | 1 | 382652 | 29.125 | NaN | Q |
---|
midage = df[(df['年龄']>=10) & (df['年龄']<=50)]
midage.head(3)
| 乘客ID | 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
1.5.2 筛选后找出midage中100位的数据
midage = midage.reset_index(drop=True)
midage.loc[[100],['姓名','性别']]
| 姓名 | 性别 |
---|
100 | Byles, Rev. Thomas Roussel Davids | male |
---|
这里一定要先用新的midage数据集覆盖掉原有的,reset_index是为了抹除原有的索引,建立新的,drop = True是为了覆盖掉原有数据集。
midage.iloc[[100,105,120],[3,4]]
| 姓名 | 性别 |
---|
100 | Byles, Rev. Thomas Roussel Davids | male |
---|
105 | Cribb, Mr. John Hatfield | male |
---|
120 | Carbines, Mr. William | male |
---|
.iloc要求loc的项目都为第几行第几列,而非列名称行名称。
1.6了解数据
首先,先导入刚才的中文版数据
text = pd.read_csv('/Users/WEH5SZH/Desktop/data_analysis/U1/train_chinese.csv')
1.6.1 排序操作
frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index=['2', '1'],columns=['d', 'a', 'b', 'c'])
frame
pd.DataFrame创建DataFrame对象,.arange生成0-7八个数的数组,.reshape规定行数和列数,index建立索引列并命名,colunms建立索引索引行。
frame.sort_values(by='c',ascending = True)
ascending,True表示升序,False表示降序,by = ‘排序索引对象’
frame.sort_index()
frame.sort_index(axis = 1, ascending = False)
.sort_index(默认axis = 0),0行索引,1列索引
1.6.2 综合排序
text.sort_values(by=['票价','年龄'], ascending = False).head(3)
| 乘客ID | 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
679 | 680 | 1 | 1 | Cardeza, Mr. Thomas Drake Martinez | male | 36.0 | 0 | 1 | PC 17755 | 512.3292 | B51 B53 B55 | C |
---|
258 | 259 | 1 | 1 | Ward, Miss. Anna | female | 35.0 | 0 | 0 | PC 17755 | 512.3292 | NaN | C |
---|
737 | 738 | 1 | 1 | Lesurer, Mr. Gustave J | male | 35.0 | 0 | 0 | PC 17755 | 512.3292 | B101 | C |
---|
1.6.3 Pandas算术特征
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
columns=['a', 'b', 'c'],
index=['one', 'two', 'three'])
frame1_a
| a | b | c |
---|
one | 0.0 | 1.0 | 2.0 |
---|
two | 3.0 | 4.0 | 5.0 |
---|
three | 6.0 | 7.0 | 8.0 |
---|
frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
columns=['a', 'e', 'c'],
index=['first', 'one', 'two', 'second'])
frame1_b
| 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 |
---|
frame1_a + frame1_b
| 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 |
---|
【总结】 1.两个数据集相加得到的结果还是个数据集 2.相加时,运算逻辑是对应相加,无法对应则返回NaN
1.6.4 船上存活的最大家族的人数是多少
max(text['兄弟姐妹个数'] + text['父母子女个数'])
10
1.6.5 查看数据基本信息
text['票价'].describe()
count 891.000000
mean 32.204208
std 49.693429
min 0.000000
25% 7.910400
50% 14.454200
75% 31.000000
max 512.329200
Name: 票价, dtype: float64
【总结】 .describe()显示的信息: count : 样本数据大小 mean : 样本数据的平均值 std : 样本数据的标准差 min : 样本数据的最小值 25% : 样本数据25%的时候的值 50% : 样本数据50%的时候的值 75% : 样本数据75%的时候的值 max : 样本数据的最大值
|