数据分析项目练习笔记和查漏补缺
使用工具:Jupyter
使用库:Pandas,NumPy
参考资料:
https://pandas.pydata.org/docs/user_guide/10min.html
https://www.osgeo.cn/numpy/user/absolute_beginners.html
1、语句
# 库导入
import 库名 as 别名
2、读取数据
*因为项目中是csv文档,此处只关注csv文档读取
# 相对路径可直接导入
pd.read_csv("train.csv")
# 绝对路径先获取地址
import os
os.path.abspath("train.csv")# 再导入数据
pd.read_table("E:\study(external)\数据分析\whale\hands-on-data-analysis\第一单元项目集合\train.csv", sep = ",")
read_csv和read_table的差别
- read_csv() 的默认分隔符是 ','
- read_table() 的默认分隔符是 '\t'
- 可通过设定参数sep = '自定义分隔符'进行修正
按数据块读取
df3 = pd.read_table("E:\study(external)\数据分析\whale\hands-on-data-analysis\第一单元项目集合\train.csv", sep = ",", chunksize = 1000)
df3.get_chunk(10)
- chunksize是指想一次性读取的数据块,逐块读取
- 主要用于大文件读取,防止过大的文件读取时间过长
- df3是一个iterator
获取具体数据:
df3.get_chunk()
for i in df3: print(i)
3、修改表头
- 方法1:columns
df1.columns = ['乘客ID', '是否幸存', '乘客等级(1/2/3等舱位)', '乘客姓名', '性别', '年龄', '堂兄弟/妹个数', '父母与小孩个数', '船票信息', '票价', '客舱', '登船港口']
df1.head(10)
方法2:rename
df1 = df1.rename({'PassengerId': '乘客ID','Survived': '是否幸存','Pclass': '乘客等级(1/2/3等舱位)','Name': '乘客姓名','Sex': '性别','Age': '年龄','SibSp': '堂兄弟/妹个数','Parch': '父母与小孩个数','Ticket': '船票信息','Fare': '票价','Cabin': '客舱','Embarked': '登船港口'}, axis='columns')
df1.head(10)
方法3:name
df1 = pd.read_csv("train.csv", names = ['乘客ID', '是否幸存', '乘客等级(1/2/3等舱位)', '乘客姓名', '性别', '年龄', '堂兄弟/妹个数', '父母与小孩个数', '船票信息', '票价', '客舱', '登船港口'])
df1.head(10)
4、查看数据
- 行列数量
df1.shape
- 总数据
df1.size
- 是否为空
df1.empty
- 从头查看
df1.head(10)
- 从尾查看
df1.tail(15)
- 寻找空值
df1.isna()
df1.isnull()
*常见的数据观察角度
最大最小,平均数,中位数,分布,比例,总数,方差等
5、保存修改后的数据
df1.to_csv("train_chinese.csv")
6、读取列标签
df1.columns
7、选取特定范围(行列)
loc根据标签定位
data_cabin = df1.loc[:,"Cabin"]
选中标签为Cabin的整列(前行后列)
iloc根据索引定位
data_cabin = df1.iloc[1:4, 10]
选中第11列的2-5行
8、比对训练集和测试集的数据维度,提取共有的列
对比
df_tr = pd.read_csv("train.csv")
df_tr.columns
df_te = pd.read_csv("test_1.csv")
df_te.columns
删除多余的列
df_te = df_te.drop(columns = ['a'])
选取需要的列
df_te = df_te.iloc[:, :-1]
9、隐藏不需要分析的列
df_part = df_tr.drop(columns = ['PassengerId','Name','Age','Ticket'])
10、筛选
单条件筛选
df_tr[df_tr["Age"] < 10].head()
多条件筛选
df_tr[(df_tr["Age"] > 10) | (df_tr["Age"] < 50)].head()
- 并集 |, 交集 &,取反~
11、选取单个数据
midage.loc[[100],['Pclass','Sex']]
修正索引,不修正时会使用默认索引,导致错位
midage = midage.reset_index(drop=True)
12、排序
索引排序
df_mytr.sort_index(axis=1(0行1列), ascending=False(T升F降))
数据排序
df_mytr.sort_values(by=['a', 'c'](排序的列), ascending=False)
其他小知识
1、DataFrame v.s. Series
Series:是一个一维不可变的数据结构,标签数据不要求唯一,但要求必须不可变(类似于内部用哈希算法加了个索引)
series_data = {'资产': 21000, '负债': 11000, '所有者权益': 10000, '收入': 10000, '费用': 5000, '利润': 5000}
example_series = pd.Series(series_data)
example_series
- 一维标签
- 基于标签运算
- 可以视为一维字典
DataFrame(主要数据结构):是一个二维并且数据大小可变的数据结构,允许内部行列结构有所差异
dataframe_data = {'报表名录': ['资产', '负债', '所有者权益', '收入', '费用', '利润'],
'甲公司': [21000, 12000, 9000, 10000, 500, 9500],
'乙公司': [21000, 11000, 10000, 10000, 5000, 5000]}
example_dataframe = pd.DataFrame(dataframe_data)
example_dataframe
- 行列都可以有标签
- 行列都可进行数学运算
- 可以视为一个二维字典
2、如何生成自己的数据
生成一个n*m的数组
np.arange(n*m).reshape((n, m))
准备横坐标
index=[2,1,3]
准备纵坐标
columns=['d', 'a', 'b', 'c']
构建df
df_mytr = pd.DataFrame(np.arange(12).reshape((3, 4)), index, columns)
3、df运算
相加
df1 + df2(名称一样的行列相加,无对应维度的Nan)
4、查看基本统计信息
df2.describe()