学习目的:通过真实的数据,以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。
数据加载
一、 载入数据
1、通过 import
语句进行引入 NumPy 与 Pandas 二库,习惯命名 np
与 pd
import numpy as np
import pandas as pd
2、 载入数据:
通过read_csv
方法
(1) 使用相对路径载入数据
df = pd.read_csv('./train.csv')
(2) 使用绝对路径载入数据
df = pd.read_csv(r"D:\大学作业\p\train.csv")
3、每1000行为一个数据模块,逐块读取:
通过 read_csv
的 chunksize
参数可变成一个数据模块逐块读取
当一个dataframe占据较大内存时并对其进行操作时会由于占用内存过大而导致处理速度极速下降。 所以要通过设置chunksize参数来返回一个固定行数的迭代器,每次读取只消耗相应行数对应的dataframe的内存即可,从而有效解决内存消耗过多的问题
chunker = pd.read_csv('./train.csv',chunksize=1000)
for i in chunker:
print(i)
4、将表头改成中文,索引改为乘客ID:
PassengerId | 乘客ID |
Survived | 是否幸存 |
Pclass | 乘客等级(1/2/3等舱位) |
Name | 乘客姓名 |
Sex | 性别 |
Age | 年龄 |
SibSp | 堂兄弟/妹个数 |
Parch | 父母与小孩个数 |
Ticket | 船票信息 |
Fare | 票价 |
Cabin | 客舱 |
Embarked | 登船港口 |
通过 read_csv
函数的 names
参数,将列名重命名 并且指定索引 index
列为 '乘客ID'
注:通过names进行重命名 顺序为倒序
df = pd.read_csv('train.csv', names=['乘客ID', '是否幸存', '乘客等级(1/2/3等舱位)', '乘客姓名', '性别', '年龄', '堂兄弟/妹个数', '父母与小孩个数', '船票信息', '票价', '客舱', '登船港口'], index_col='乘客ID', header=0)
是否幸存 | 乘客等级(1/2/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 |
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 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
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 |
二、初步观察:
导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等
1、查看数据的基本信息:
直接使用 info
函数获取数据信息
df.info()
<class 'pandas.core.frame.DataFrame'> Index: 891 entries, 1 to 891 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 是否幸存 891 non-null int64 1 乘客等级(1/2/3等舱位) 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
2、观察表格前10行的数据和后15行的数据:
直接使用 head
函数和 tail函数
获取前任意行或末尾任意行的数据信息。
df.head(10)
df.tail(15)
是否幸存 | 乘客等级(1/2/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 |
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 |
是否幸存 | 乘客等级(1/2/3等舱位) | 乘客姓名 | 性别 | 年龄 | 堂兄弟/妹个数 | 父母与小孩个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
877 | 0 | 3 | Gustafsson, Mr. Alfred Ossian | male | 20.0 | 0 | 0 | 7534 | 9.8458 | NaN | S |
878 | 0 | 3 | Petroff, Mr. Nedelio | male | 19.0 | 0 | 0 | 349212 | 7.8958 | NaN | S |
879 | 0 | 3 | Laleff, Mr. Kristo | male | NaN | 0 | 0 | 349217 | 7.8958 | NaN | S |
880 | 1 | 1 | Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) | female | 56.0 | 0 | 1 | 11767 | 83.1583 | C50 | C |
881 | 1 | 2 | Shelley, Mrs. William (Imanita Parrish Hall) | female | 25.0 | 0 | 1 | 230433 | 26.0000 | NaN | S |
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 |
3、判断数据是否为空,为空的地方返回True,其余地方返回False:
直接使用 isnull
函数判断是否存在空值,并返回 bool
类型数据
df.isnull().head(5)
#前五行
是否幸存 | 乘客等级(1/2/3等舱位) | 乘客姓名 | 性别 | 年龄 | 堂兄弟/妹个数 | 父母与小孩个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客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 |
三、保存数据
将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
直接使用 to_csv
函数保存为指定名称的 CSV 文件。
注:由于不同操作系统的默认文本编码不同,Windows 上默认为 GBK
,GNU/Linux 上默认为 UTF-8
,如所保存的文件出现乱码现象,就通过encoding
参数指定文件编码。
df.to_csv("train_chinese.csv")
四、知道你的数据叫什么
1、pandas中两个数据类型DateFrame和Series:
区别:series,只是一个一维数据结构,它由index和value组成。
dateframe,是一个二维结构,除了拥有index和value之外,还拥有column。
联系:dataframe由多个series组成,无论是行还是列,单独拆分出来都是一个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 |
2、查看DataFrame数据的每列的名称:
df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
3、查看"Cabin"这列的所有值 :
df['Cabin'].head(3)
得到的结果是 Series
类型的
df.Cabin.head(3)
得到的结果是DataFrame类型的
0 NaN 1 C85 2 NaN Name: Cabin, dtype: object
4、加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除:
经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去
test1 = pd.read_csv("test_1.csv")
del test1['a']
5、将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素:
直接使用drop函数 axis=1表示列
df.drop(['PassengerId','Name','Age','Ticket'],axis=1)
五、筛选的逻辑
1、以"Age"为筛选条件,显示年龄在10岁以下的乘客信息:
df[df['Age']<10].head(3)
2、以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage:
&
表示“并且”,|
表示“或者”
midage = df[(df['Age']>10)&(df['Age']<50)]
3、将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来:
可以使用 DataFrame
的 loc
属性来实现,并传入我们的查询条件
midage.loc[[100],["Pclass",'Sex']]
4、使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来:
midage.loc[[100,105,108],['Pclass','Name','Sex']]
5、使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来:
iloc
与 loc区别为
其中对列的索引由列名的方式改为了整数下标的方式
midage.iloc[[100,105,108],[2,3,4]]
六、了解你的数据吗
1、利用Pandas对示例数据进行排序,要求升序:
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
index=['2', '1'],
columns=['d', 'a', 'b', 'c'])
frame
frame.sort_values(by='c',ascending=True)
直接通过sort_values函数进行排序 by参数指向要排的列 ascending=True指升序 False为降序
# 让行索引升序排序
frame.sort_index()
# 让列索引升序排序
frame.sort_index(axis=1)
# 让列索引降序排序
frame.sort_index(axis=1,ascending=False)
# 让任选两列数据同时降序排序
frame.sort_values(by=['a','c'],ascending=False)
2、对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列):
test.sort_values(by=['票价','年龄'],ascending=False)
3、利用Pandas进行算术计算,计算两个DataFrame数据相加结果:
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'])
#将frame_a和frame_b进行相加
framel_a + framel_b
两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
4、通过泰坦尼克号数据如何计算出在船上最大的家族有多少人:
就是'兄弟姐妹个数’+‘父母子女个数’然后用max函数求最大值
max(text['堂兄弟/妹个数'] + text['父母与小孩个数'])
5、学会使用Pandas describe()函数查看数据基本统计信息:
frame2 = pd.DataFrame([[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]
], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])
frame2.describe()
'''
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值
'''
6、分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么:
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