目录
数据加载
一、加载数据
载入数据:
逐块读取
更改表头、索引
初步观察数据
保存数据
pandas基础
Series
DataFrame
筛选
探索性数据分析
数据加载
一、加载数据
import numpy as np
import pandas as pd
载入数据:
df = pd.read_csv('train.csv') #相对路径
#绝对路径如:df = pd.read_csv('C:UsersLenovotrain.csv')
df.head(3) #输出头三行
import numpy as np import pandas as pd
载入数据:
df = pd.read_csv('train.csv') #相对路径
#绝对路径如:df = pd.read_csv('C:UsersLenovotrain.csv')
df.head(3) #输出头三行
思考:tsv和csv的区别,pd.read_csv()和pd.read_table()的不同
各种格式文件读取:IO tools (text, CSV, HDF5, …) — pandas 1.4.2 documentation
pd.read_csv()一般是读取csv文件的,pd.read_table()读取txt文件。函数pd.read_csv()和pd.read_table()的内容相同,只是默认分隔符不同。
在read_csv()中,定界符为 “ , ” ,在read_table()中,定界符为 t 。
df = pd.read_table('train.csv')
df.head(3)
通过sep=’,’,让pd.read_table()实现pd.read_csv()的功能:
#此时输出内容与csv一致
df=pd.read_table('train.csv',sep=',')
df.head(3)
同理,通过sep=’t’,让pd.read_csv()实现pd.read_table()的功能。
逐块读取
当读取的文件较大时,这时若直接利用pandas读取,会给电脑造成太大的压力:
chunker = pd.read_csv('train.csv', chunksize=1000)
for chunk in chunker:
print(chunk)
【提示】可以chunker(数据块)是什么类型?用for循环打印出来出处具体的样子是什么?
读取pandas中DataFrame的数据类型。按列竖切切成几块读取,每次读1000行。
更改表头、索引
将表头改成中文,索引改为乘客ID
PassengerId => 乘客ID,Survived => 是否幸存,Pclass => 乘客等级(1/2/3等舱位),Name => 乘客姓名,Sex => 性别,Age => 年龄,SibSp => 堂兄弟/妹个数,Parch => 父母与小孩个数,Ticket => 船票信息,Fare => 票价,Cabin => 客舱,Embarked => 登船港口。
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head()
思考:所谓将表头改为中文其中一个思路是:将英文列名表头替换成中文。还有其他的方法吗?
df = pd.read_csv('train.csv')
df.rename(columns={'PassengerId':'乘客ID','Survived':'是否幸存','Pclass' :'仓位等级','Name' :'姓名','Sex' :'性别','Age' :'年龄','SibSp' :'兄弟姐妹个数','Parch' :'父母子女个数','Ticket' :'船票信息','Fare' :'票价','Cabin' :'客舱','Embarked' :'登船港口'}, inplace = True)
df =df.set_index('乘客ID')
df
初步观察数据
#查看数据的基本信息
df.info()
#观察表格前10行的数据和后15行的数据
df.head(10)
df.tail(15)
#判断数据是否为空,为空的地方返回True,其余地方返回False
df.isnull().head()
保存数据
#将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
df.to_csv('train_chinese.csv')
#将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
df.to_csv('train_chinese.csv')
pandas基础
Series
是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据便签(即索引)组成,仅由一组数据即可产生最简单的Series。
1、直接定义,自动生成索引
a=Series([9,-3,4,2])
输出:
0 9
1 -3
2 4
3 2
系统会自动为Series数据创建整数索引,可通过Series的values和index属性获取其数组表示形式和索引对象:
print(Series.values)
print(Series.index)
与字典型数据的keys(),values(),items()类似。
2、直接将一个字典型数据a转化为Series数据,Series(a)
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} example_1 = pd.Series(sdata) example_1键值变成index,数据值变成columns。
3、创建Series时可自定义索引值
b=Series([9,-3,4,2],index=['a','c','d','b'])
那么访问Series中的值时可以直接用b['index']的方法,例如b['c'],b[['d','a']]可以同时选取多个值。
DataFrame
是一个表格型数据,含有一组有序的列,每一列可以是不同的类型值。DataFrame可以看成是由多个Series组成的字典,它们共用一个索引。
在构建DataFrame时,最常用的就是先创建一个data,data一般可以是字典和数组,再用a=DataFrame(data)来转换为DataFrame结构。在DataFrame(data)时也可以同时传入index和columns参数,两个参数必须是列表型。
#DataFrame会自动加上索引 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
任务:查看DataFrame数据的每列的名称
df.columns
任务: 查看某列的所有值 [有多种方法]
df['Cabin'].head(3) #or df.Cabin.head(3)
任务:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
test_1 = pd.read_csv('test_1.csv')
test_1.head(3)
多了一列a
删除多余行:
del test_1['a'] test_1.head(3)
思考:还有其他的删除多余的列的方式吗?
有的!
#不同于del方法,drop方法一次可删除多列 test_1 = test_1.drop(['a'],axis=1,inplace=True) test_1.head(3)
任务:将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素
#利用drop删除方法,但是未设置inplace=True,故相当于创建副本,隐藏表格内容。 df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
筛选
以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
df[df["Age"]<10].head(3)
以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage:
midage = df[(df["Age"]>10)& (df["Age"]<50)] midage.head(3)
将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来:
midage = midage.reset_index(drop=True) midage.head(3) midage.loc[[100],['Pclass','Sex']] #reset_index()重置索引 #在获得新的index,原来的index变成数据列,保留在数据框中,不想保留原来的index的话可以使用参数drop=True,默认False。 #因为midage为原数据表摘出来的,索引是打乱的,所以需要reset_index()重置索引,才能进行摘取100行操作。
对比iloc和loc的异同:
loc是根据index来索引,比如df定义了一个index,那么loc就根据这个index来索引对应的行。iloc并不是根据index来索引,而是根据行号来索引,行号从0开始,逐次加1。
midage.loc[[100,105,108],['Pclass','Name','Sex']] midage.iloc[[100,105,108],[2,3,4]]
探索性数据分析
任务:利用Pandas对示例数据进行排序,要求升序
#自己构建一个都为数字的DataFrame数据
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),#创建一个DataFrame对象
index=['2', '1'],
columns=['d', 'a', 'b', 'c'])
frame
frame.sort_values(by='c', ascending=True)
#构建的DataFrame中的数据根据c列,ascending=True升序排列
frame.sort_index() # 让行索引升序排序
frame.sort_index(axis=1) # 让列索引升序排序
frame.sort_index(axis=1, ascending=False) # 让列索引降序排序
frame.sort_values(by=['a', 'c'], ascending=False)# 让a,c两列数据同时降序排序
任务:利用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'])
frame1_a
frame1_b
frame1_a + frame1_b
+ =
现在通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
''' 还是用之前导入的chinese_train.csv如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’),我们该怎么做呢? ''' max(text['兄弟姐妹个数'] + text['父母子女个数'])
任务: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 函数,观察frame2的数据基本信息 frame2.describe() ''' count : 样本数据大小 mean : 样本数据的平均值 std : 样本数据的标准差 min : 样本数据的最小值 25% : 样本数据25%的时候的值 50% : 样本数据50%的时候的值 75% : 样本数据75%的时候的值 max : 样本数据的最大值 '''
现在分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据:
''' 看看泰坦尼克号数据集中 票价 这列数据的基本统计数据 ''' 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 '''



