目录
1 数据载入及初步观察
1.1 载入数据
df = pd.read_csv(r'C:\Users\Wings\桌面\train.csv')
#因为windows下的目录字符串中的"\"在Python的字符串中有转义的作用,在路径前加r可以避免这个现象
1.1.1 绝对路径与相对路径
open('aaa.txt')
open('/data/bbb.txt')
open('D:\\user\\ccc.txt')
前两个都是相对路径,第三个则是绝对路径。绝对路径就是最完整的路径,相对路径的相对则是不完整路径,这个相对指的就是相对于当前文件夹路径。
绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。
相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。
import os
path1=os.path.abspath('.') # 表示当前所处的文件夹的绝对路径print(path1)
# C:\Users\lenovo\Desktop\Jupyter\hands-on-data-analysis-master\第一单元项目集合
path2=os.path.abspath('..') # 表示当前所处的文件夹上一级文件夹的绝对路径print(path2)
# C:\Users\lenovo\Desktop\Jupyter\hands-on-data-analysis-master
path3=os.path.abspath('第一章:第一节数据载入及初步观察-课程.ipynb')
# C:\Users\lenovo\Desktop\Jupyter\hands-on-data-analysis-master\第一单元项目集合\第一章:第一节数据载入及初步观察-课程.ipynb
# 调用os.path.abspath(path)将返回path参数的绝对路径的字符串,这是将相对路径转换为绝对路径的简便方法
os.getcwd()
# C:\\Users\\lenovo\\Desktop\\Jupyter\\hands-on-data-analysis-master\\第一单元项目集合
print(os.path.abspath("../第二章项目集合/result.csv"))
# C:\Users\lenovo\Desktop\Jupyter\hands-on-data-analysis-master\第二章项目集合\result.csv
# 调用os.path.isabs(path),如果参数是一个绝对路径,就返回True,如果参数是一个相对路径,就返回False
path = 'C:\\Users\\lenovo\\Desktop\\Jupyter\\hands-on-data-analysis-master\\第一单元项目集合\\test_1.csv'
os.path.isabs(path)
# True
path = '第一单元项目集合\test_1.csv'
os.path.isabs(path)
# False
# 调用os.path.dirname(path)将返回一个字符串,它包含path参数中最后一个斜杠之前的所有内容
path = 'C:\\Users\\lenovo\\Desktop\\Jupyter\\hands-on-data-analysis-master\\第一单元项目集合\\test_1.csv'
os.path.dirname(path)
# 'C:\\Users\\lenovo\\Desktop\\Jupyter\\hands-on-data-analysis-master\\第一单元项目集合'
# 如果同时需要一个路径的目录名称和基本名称,可以调用os.path.split()获得这两个字符串的元组
path = 'C:\\Windows\\System32\\calc.exe'
os.path.split(path)
# ('C:\\Users\\lenovo\\Desktop\\Jupyter\\hands-on-data-analysis-master\\第一单元项目集合',
'test_1.csv')
1.1.2 TSV与CSV
TSV:tab separated values;即“制表符分隔值”,如:
name age
张三 20
李四 30
CSV: comma separated values;即“逗号分隔值”,如:
name,age
张三,20
李四,30
# 读取文本文件
pd.read_table(filepath, sep = ‘\t’)
# 读csv文件
pd.read_table(filepath, sep = ‘,’)
1.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
1.3修改列名
test_1.rename(columns={'PassengerId': '乘客ID', 'Survived': '是否幸存'}, inplace=True)
# inplace=True 必须加上 不加上 改不了
test_1.columns = ['', '乘客ID', '是否幸存', '乘客等级(1/2/3等舱位)', '乘客姓名', '性别', '年龄', '堂兄弟/妹个数', '父母与小孩个数', '船票信息', '票价', '客舱', 'Embarked', 'a']
# 需要列出所有列名
2 初步观察
2.1 数据基本信息
test_1.info()
print(test_1.index) #查看索引
print(test_1.values) #查看数据值
print(test_1.columns) #查看每一列的列表头内容
print(test_1.dtypes) #查看数据类型
print(test_1.size) #查看数据大小
print(test_1.shape) #查看数据几行几列
2.2 缺失值
# 判断数据是否为空,为空的地方返回True,其余地方返回False。相反 test_1.notnull()
test_1.isnull()
# 判断哪些列包含缺失值,该列存在缺失值则返回True,反之False。
df.isnull().any()
# 每列缺失值的数量
isnull().sum()
缺失数据处理:
判断一个数据框是否为空数据框:属性empty()
在Python基础语法中,None不能参加计算,NaN可以参加计算,而在Pandas中,二者一样,都可以参加计算,将None自动转换为np.nan(float类型
补齐缺失值:
fill_value = 0
用均值补齐缺失值:DataFrame.stack().mean()
mean() 按行计算,stack()则是建立多级索引,一起用就可以得到整个数据框的均值
unstack()则为撤销多级索引
常用函数
isnull() :判断每个元素是否为空
notnull() :判断是否非空
dropna():直接删除缺失值
fillna():设置缺失值的补齐方式
可以设置method = "ffill 或 bfill ,既向前填充或向后填充
2.3 保存数据
test_1.to_csv('train_chinese.csv', sep=',',encoding = 'gbk')
2.4 创建DataFrame
Series是一个一维的结构
创建Series的语法:pd.Series();
常用的几个参数:
index,用于指定新的索引,例如pd.Series(arr1,index=[‘a’,‘b’,‘c’,‘d’,‘e’])以a,b,c,d,e作为行索引;
dtype,用于指定元素的数据类型;
# 1. 通过list创建
s = pd.Series([1,2,3,4,5])
# 2. 通过一维数组创建
x = np.arange(1,10)
s = pd.Series(x)
# 3. 通过字典创建
dict = {'name':'么大头','age':20,'sex':'男'}
s = pd.Series(dict)
# 也可以指定索引,索引和字典键相同才有效,否则默认为NaN
s = pd.Series(dict,index = ['name','age','class','sex'])
print(s)
DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。
data = np.arange(8).reshape((2, 4)) #生成一个二维数组
frame = pd.DataFrame(data,index=[2,1],columns=['d', 'a', 'b', 'c'] ) #pd.DataFrame()创建一个DataFrame对象,index对象的索引列,columns对象的索引行
#构造dataframe
data = {'a':[1,2,3,4],
'b':(5,6,7,8),
'c':np.arange(9,13)}
frame = pd.DataFrame(data)
print(frame)
#字典嵌套
data1 = {
'a':{'apple':3.6,'banana':5.6},
'b':{'apple':3,'banana':5},
'c':{'apple':3.2}
}
pd2 = pd.DataFrame(data1)
print(pd2)
2.5 筛选的逻辑
注意:
midage = df[(df["Age"]>10)& (df["Age"]<50)]
reset_index()函数
作用:使用索引重置生成一个新的DataFrame或Series,可以把索引用作列。
2.6 iloc与loc
http://t.csdn.cn/siIxy
loc——通过行标签索引行数据
iloc——通过行号索引行数据
ix——通过行标签或者行号索引行数据(基于loc和iloc 的混合)
midage.loc[[100,105,108],['Pclass','Name','Sex']] # 左闭右闭
midage.iloc[[100,105,108],[2,3,4]] # 左闭右开
3 探索性数据分析
3.1 排序
sort_values():按数值排序
sort_values(by=‘b’,ascending=False)
by:排序的依据,by=‘b’ 表示依据b列的数据进行排序;
ascending:排序方式,默认升序,ascending=False 表示降序;
df.sort_values(by='年龄',ascending=True) #默认升序
在DataFrame中,可以将一个或多个列的名字传递给sort_values的by选项,来实现对一个或多个列中的值进行排序。
要根据多个列进行排序,传入名称的列表即可:
frame.sort_index(by=['a','b'])
特别的,在排序时,任何缺失值默认都会被放到Series的末尾。
sort_index():按索引排序
sort_index(axis=1,ascending=False)
axis:行索引或列索引,默认为列索引排序,axis = 1 表示对行进行排序;
ascending:排序方式,默认升序,ascending=False 表示降序;
obj = pd.Series(range(4),index=['d','a','b','c']) obj obj.sort_index()
对于DataFrame,则可以根据任意一个轴上的索引进行排序:
frame.sort_index() #默认为0
frame.sort_index(axis=1)
3.2 dataframe运算
使用“+”运算符
# DataFrame与标量的运算:df中的每个元素与100一一相加
df1 = df + 100
display(df1)
# 一列(Series)与标量的运算
display(df["a"])
df["a"] = df["a"] + 100
display(df)
使用“add()”函数
x = [[np.nan,1,1,1,1],[2,2,np.nan,2,2],[3,3,3,3,3],[4,np.nan,4,4,4]]
df = pd.DataFrame(x,columns=list("abcde"))
display(df)
df1 = df.add(100)
display(df1)
# 可以使用fill_value参数,给缺失值nan添加默认值
df2 = df.add(100,fill_value=1000)
display(df2)
注意:减法运算和加法运算的运算一摸一样,只需要将+换为-,将add()换位sub()即可。
DataFrame与DataFrame之间的运算,由于DataFrame中的每一元素都由其行列索引唯一确定,也就是说DataFrame中的每一元素都有一个(行索引,列索引)构成的坐标 。因此对于不同的DataFrame,只用索引匹配上的数据,对应元素相加,对于没有匹配上的数据,返回的是NaN值 。