目录
- 1 数据载入
- 1.1 载入数据
- 1.2 read_csv和read_table的区别
- 1.3 逐块读取
- 1.4 修改表头和索引
- 2 数据初步观察
- 2.1 查看数据基本信息
- 2.2 保存数据
- 3 pandas数据结构和列操作
- 3.1 Series 和DataFrame
- 3.2 查看 DataFrame数据每列的名称和值
- 3.3 DataFrame 的列删除和隐藏
- 4 数据筛选
- 4.1 筛选列数据
- 4.2 筛选特定数据
- 5 探索性数据分析
- 5.1 数据排序
- 5.2 DataFrame数据相加
- 5.3 查看数据基本信息
- Datawhale课程链接:链接
- 参考教材:《Python for Data Analysis》
1 数据载入
1.1 载入数据
- 相对路径: 相对于当前文件来说,要选择的文件的位置
- 绝对路径:针对电脑来说,目标文件的位置
# 绝对位置 df=pd.read_csv('C:\Users\YG小白\DW数据分析学习\train.csv')# 报错 # SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes
- 原因:在windows系统当中读取文件路径可以使用\,但是在python字符串中\有转义的含义
- 方法:在路径前面加r,即保持字符原始值的意思
df=pd.read_csv(r'C:\Users\YG小白\DW数据分析学习\train.csv')
使用
os.getcwd()
查看当前工作目录,记住要提前导入OS
1.2 read_csv和read_table的区别
- read_csv:从文件读取分隔好的数据,默认分隔符是逗号。即是将每个元素作为一列存储
df1=pd.read_csv('train.csv',nrows = 3) print("pd.read_csv读取数据行列数为:",df1.shape) # pd.read_table读取数据行列数为: (3, 12)
- read_table:从文件读取分隔好的数据,默认分隔符是制表符(‘\t’),即以行为单位进行分隔。即是将每行所有的元素作为一个维度存储在一起,因此只有一列
df2 = pd.read_table('train.csv',nrows = 3)#只读取3行数据 print("pd.read_table读取数据行列数为:",df2.shape) # pd.read_table读取数据行列数为: (3, 1)
- 若想用read_table读取出read_csv的效果,设置
sep = ','
即可pandas.read_table(数据文件名, sep=’\t’, header=’infer’) pandas.read_csv(数据文件名, sep=’,’, header=’infer’
1.3 逐块读取
- 原理:将数据分成小块按块读入,得到的对象指向了多个分块对象,但并没有将实际数据先读入,而是在提取数据时才将数据提取进来。可减少内存的存储与计算资源
- chunker(数据块)是什么类型?
chunker = pd.read_csv('train.csv', chunksize=400) #指定 `chunkersize`参数作为每一块的行数 print(type(chunker)) # TextParser for piece in chunker: print(type(piece)) print(len(piece))
有
chunkersize
参数可以进行逐块加载,本质就是将文本分成若干块,每次处理chunkersize
行的数据,最终返回一个TextParser
对象,对该对象进行迭代遍历,可以完成逐块统计的合并处理。
1.4 修改表头和索引
- 方法1:读取时直接处理
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'], index_col='乘客ID',header=0)
- 方法2:用
rename
函数,用字典的形式替换式的修改,可随意修改个数data_df.rename(columns={'PassengerId': '乘客ID', 'Survived': '是否幸存', 'Pclass': '乘客等级(1/2/3等舱位)', 'Name': '乘客姓名', 'Sex': '性别', 'Age': '年龄', 'SibSp': '堂兄弟/妹个数', 'Parch': '父母与小孩个数', 'Ticket': '船票信息', 'Fare': '票价', 'Cabin': '客舱', 'Embarked': '登船港口'},index = '乘客ID', inplace = True)
- 读取后修改列名
df.columns = ['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口']
2 数据初步观察
2.1 查看数据基本信息
- 查看数据的基本信息
df.info() # 打印摘要 df.describe() # 打印描述性统计信息
- info函数:给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用
- describe()函数:直接给出样本数据的一些基本的统计量,包括均值,标准差,最大值,最小值,分位数等。
df.shape # DataFrame行数和列数 df.dtypes # 数据类型 df.values # 数组形式 df.columns # 列标签<Index> df.columns.values # 列标签<ndarray> df.index # 行标签<Index> df.index.values # 行标签<ndarray>
- 观察指定位置的数据
df.head(n) # 前n行 df.tail(n) # 后n行 df.options.display.max_columns=n # 最多显示n列 df.options.display.max_rows=n # 最多显示n行
- 判断数据是否为空
df.isnull()
2.2 保存数据
df.to_csv('train_chinese.csv', encoding = 'utf-8')
若不想存索引,则增加
index = False
;
不同的操作系统保存下来可能会有乱码。大家可以加入encoding=‘GBK’ 或者encoding = ‘uft-8’
3 pandas数据结构和列操作
3.1 Series 和DataFrame
-
pandas 有两个主要的数据结构:Series 和 DataFrame
- DataFrame是一种表格型数据,含有一组有序的列,既有行索引也有列索引
- Series 是一个一维数组对象,只有行索引,由一组数据及其标签组成
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} example_1 = pd.Series(sdata) example_1
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
3.2 查看 DataFrame数据每列的名称和值
df.columns # 查看列的名称
df['Cabin'] # 方法1:查看 "Cabin" 列的所有值
df.Cabin # 方法2:查看 "Cabin" 列的所有值
3.3 DataFrame 的列删除和隐藏
# 列删除
# 单列删除
del df['a']
# 多列删除
df.drop(['PassengerId', 'Name', 'Age'], axis = 1, inplace = True)
# 列隐藏
df.drop(['PassengerId', 'Name', 'Age'], axis = 1)
- drop函数
- 默认删除行,列需要加
axis = 1
- 如果想要完全删除数据结构,使用
inplace=True
,默认inplace=False
- 默认删除行,列需要加
- del和drop区别
del
函数是Python
的内置函数函数,仅对列进行操作,一次只能操作一个,仅是就地操作drop
函数是属于pandas
中的内置函数,对列和行都进行操作,一次可以处理多个项目,可以就地操作或返回副本
4 数据筛选
4.1 筛选列数据
#【单一条件筛选】
# 显示年龄在10岁以下的乘客名字
df[df['Age'] < 10]['Name']
# 【多条件筛选】
# 在10岁以上和50岁以下的乘客信息显示出来
midage =df[(df['Age'] > 10) & (df['Age'] < 50)]
4.2 筛选特定数据
- reset_index()函数
- 作用:数据清洗时,会将带空值的行删除,此时DataFrame或Series类型的数据不再是连续的索引,可以使用
reset_index()
重置索引。 - 用法:
df.reset_index(drop=True)
- 获得新的index,原来的index变成数据列,保留下来
- 不想保留原来的index,使用参数
drop=True
,默认False
。
详细链接
- 如果不使用reset_index()函数,显示的就不是midage数据中的第100行,而是df数据的第100行。
- 作用:数据清洗时,会将带空值的行删除,此时DataFrame或Series类型的数据不再是连续的索引,可以使用
- loc和iloc函数
- loc函数:基于行标签进行索引
- iloc函数:基于行的号进行索引,主要是整数,也可以用布尔数组。
- 显示midage数据中第100,105,108行的"Pclass","Name"和"Sex"的数据
# loc函数 midage.loc[[100,105,108],['Pclass','Name','Sex']] # iloc函数 midage.iloc[[100,105,108],[2,3,4]]
5 探索性数据分析
5.1 数据排序
- 创建DataFrame数据
frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index=['2', '1'], columns=['d', 'a', 'b', 'c'])
- pd.DataFrame() :创建一个DataFrame对象
- np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
- index=[‘2’, ‘1’]:DataFrame 对象的索引列
- columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行
- 排序
frame.sort_index() # 行索引升序 frame.sort_index(axis = 1) # 列索引升序 frame.sort_index(axis = 1, ascending = False) # 列索引降序 # 任取一列进行升序排序 frame.sort_values(by='c', ascending=True) # 任选两列数据同时降序排序 frame.sort_values(by=['a', 'c'], ascending=False) # sort_values这个函数中by参数指向要排列的列
5.2 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'])
# 数据相加
new_frame = frame1_a + frame1_b
# 数据合并
pd.concat([frame1_a, frame1_b], axis = 0)
两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN
5.3 查看数据基本信息
new_frame.describe()
#count : 样本数据大小
#mean : 样本数据的平均值
#std : 样本数据的标准差
#min : 样本数据的最小值
#25% : 样本数据25%的时候的值
#50% : 样本数据50%的时候的值
#75% : 样本数据75%的时候的值
#max : 样本数据的最大值