- 本文为个人复现GitHub项目Hands-on data analysis第一章的练习记录
- 参考教材:《Python for Data Analysis》
一、数据载入及初步观察
🚩 1.1 载入数据
1.1.1 导入numpy和pandas
import numpy as py
import pandas as pd
1.1.2 载入数据
- 使用绝对路径载入数据
df1 = pd.read_csv('/Users/[yourFilePath]/hands-on-data-analysis-master/hands-on-data-analysis-master/第一单元项目集合/train.csv')
- 使用相对路径载入数据
df = pd.read_csv('./train.csv')
- Output:
- 使用 pd.read_table() 载入数据
df2 = pd.read_table('./train.csv')
#df2 = pd.read_table('./train.csv', sep = ',')
df2.head()
- Output
💡 pandas 数据载入参数格式
pandas.read_table(数据文件名, sep=’\t’, header=’infer’, names=None,index_col=None, dtype=None, engine=None, nrows=None)
pandas.read_csv(数据文件名, sep=’,’, header=’infer’, names=None, index_col=None,dtype=None, engine=None, nrows=None)
- CSV为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
- TSV与CSV类似,但使用制表符’\t’隔开每一列数据
- 加载’.csv’使用read_csv,加载 ‘.tsv’ 使用read_table
read_table和read_csv区别于read_table以制表符’\t’分隔,而read_csv以逗号/字符分隔 - 如果想用read_table读取出read_csv的效果,设置sep = ','即可
1.1.3 逐块读取
- 当数据量过大时直接读取文件内存可能会不够用,这时可使用chunksize指定行数,将文本分成若干块,每次处理chunksize行的数据,最终返回一个TextParser对象并对该对象进行迭代历遍,可完成逐块的数据处理
- chunksize为每次读取的行数
chunker = pd.read_csv('./train.csv', chunksize = 100)
1.1.4 修改表头和索引
- 直接读取的时候修改
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],
index_col='乘客ID',header=0)
- dataframe里修改表头(可随意修改个数)
data_df.rename(columns={'PassengerId': '乘客ID', 'Survived': '是否幸存', 'Pclass': '乘客等级(1/2/3等舱位)', 'Name': '乘客姓名',
'Sex': '性别', 'Age': '年龄', 'SibSp': '堂兄弟/妹个数', 'Parch': '父母与小孩个数', 'Ticket': '船票信息',
'Fare': '票价', 'Cabin': '客舱', 'Embarked': '登船港口'},index = '乘客ID', inplace = True)
- dataframe里暴力修改表头
data2_df.columns = ['乘客ID', '是否幸存', '乘客等级(1/2/3等舱位)', '乘客姓名', '性别', '年龄', '堂兄弟/妹个数',
'父母与小孩个数', '船票信息', '票价', '客舱', '登船港口']
🚩 1.2 初步观察
1.2.1 查看数据的基本信息
df.info() # 打印摘要
df.describe() # 打印描述性统计信息
df.dtypes # 数据类型
df.values # 数组形式
df.to_numpy() # 数组形式
df.shape # DataFrame行数和列数
df.columns # 列标签<Index>
df.columns.values # 列标签<ndarray>
df.index # DataFrame行标签<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.memory_usage() # 占用内存
1.2.2 判断数据空值
df.isnull()
🚩 1.3 保存数据
df.to_csv('train_chinese.csv', encoding = 'utf_8_sig')
💡 若不想存索引,则增加 index = False
✔️ 不同操作系统保存下来可能会有乱码,可以尝试 encoding = ‘gbk’ / ‘utf-8’ / '…'等
🚩 1.4 知道你的数据叫什么
1.4.1 pandas 数据类型: Series 和DataFrame
- Series只有行索引,由一组数据及其标签组成
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
example_1
Output
- 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
Output
1.4.2 查看 DataFrame数据的每列的名称和值
df.columns # 查看列的名称
df['Cabin'] # 查看 "Cabin" 列的所有值
df.Cabin # 查看 "Cabin" 列的所有值
1.4.3 DataFrame 的列删除和隐藏
# 列删除
del df['a']
df.drop(['PassengerId', 'Name', 'Age'], axis = 1, inplace = True)
# 列隐藏
df.drop(['PassengerId', 'Name', 'Age'], axis = 1)
🚩 1.5 数据筛选
1.5.1 筛选列数据
- 以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
df[df['Age'] < 10].head()
- 以"Age"为筛选条件,显示年龄在10岁以下的乘客名字
df[df['Age'] < 10]['Name']
- 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage = df[(df['Age'] > 10) & (df['Age'] < 50)]
- 将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
❗ 数据清洗时需要将带空值的行删除,此时数据不再是连续的缩影,我们需要首先使用 reset_index() 重置列
💡 reset_index() 将原来的索引index作为新的一列 drop=True 去掉原索引
😀 inplace=True:不创建新的对象,直接对原始对象进行修改;
😄 inplace=False:对数据进行修改,创建并返回新的对象承载其修改结果。
# 删除空值并重置列
midage = midage.reset_index(drop = True)
# 选取特定行和列
midage.loc[100, ['Pclass', 'Sex']] # 输出为Series
midage.loc[[100],['Pclass','Sex']] # 输出为DataFrame
- 将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.loc[[100, 105, 108],['Pclass', 'Name', 'Sex']]
midage.iloc[[100,105,108],[2,3,4]]
✔️ loc 寻找索引中的标签
✔️ iloc 寻找索引中的位置
# 查找第一列数据
midage.iloc[:, 0]
# 寻找坐标在 (2, 3) 的数据
midage.iloc[2, 3]
🚩 1.6 了解数据
1.6.1 数据排序
- 行 / 列索引排序
# 示例数据
frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index = [2, 1], columns = ['d', 'a', 'b', 'c'])
#排序
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)
1.6.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'])
# 数据合并
pd.concat([frame1_a, frame1_b], axis = 0)
# 数据相加
new_frame = frame1_a + frame1_b
⚠️两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
1.6.3 查看数据基本信息
new_frame.describe()
#count : 样本数据大小
#mean : 样本数据的平均值
#std : 样本数据的标准差
#min : 样本数据的最小值
#25% : 样本数据25%的时候的值
#50% : 样本数据50%的时候的值
#75% : 样本数据75%的时候的值
#max : 样本数据的最大值