• 一起学数据分析_2


     写在前面:代码运行环境为jupyter,如果结果显示不出来的地方就加一个print()函数。

    一、数据基本处理

    缺失值处理:

    1. import numpy as np
    2. import pandas as pd
    3. #加载数据train.csv
    4. df = pd.read_csv('train_chinese.csv')
    5. df.head()
    6. # 查看数据基本信息(非空值数量、数据类型)
    7. df.info()
    8. # 查看每个数据是否为空值,每个特征中空值总数
    9. df.isnull().sum()
    10. # 年龄列填充缺失值为0,到一个副本
    11. df.fillna({'年龄':0}).head(7)
    12. df.loc[df['客舱'].isnull(), '客舱'] = 0
    13. # 同理可以填充平均值,众数等……
    14. df.isnull().sum()
    15. # 整张表处理(缺失值处填0)
    16. df = df.fillna(0)
    17. df.head()

    重复值(删除):

    数据表里重复值其所有信息一样:(0行与1行重复)

    nameagehobby
    0xx20gg
    1nn19f
    2xx20gg
    1. # 定义一个数据表
    2. a = pd.DataFrame({'name':['xx','dd','ff','gg','xx'],'habits':[11,22,33,44,11]})
    3. print(a)
    4. # 查看是否有重复行(所有信息重复)
    5. print(a.duplicated())
    6. # 处理(删除陈重复行):
    7. a.drop_duplicates()

     离散化处理(分箱):

    1. # 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
    2. # 左闭右开:right=False
    3. df['age_bins'] = pd.cut(df['年龄'], [0,15,25,35,45,80], right=False, labels = list('abcde'))
    4. df.tail()
    5. # 按百分比分段
    6. df['age_binsPercent'] = pd.qcut(df['年龄'],[.1,.2,.3,.5,.7,.9],duplicates="drop",labels=list('12345'))
    7. df.head()

     变换文本变量:

    例如性别包括男和女,用0表示男,1表示女。

    1. # 查看有哪些类型
    2. df['性别'].unique()
    3. df['客舱'].unique()
    4. df['登船港口'].unique()
    5. # 将男/女替换为0/1
    6. # inplace默认为False,返回一个副本
    7. df['性别'].replace({"male",'female'},{0,1}, inplace = True)
    8. df.head()
    9. # 按顺序替换为数字
    10. from sklearn.preprocessing import LabelEncoder
    11. df['客舱'] = LabelEncoder().fit_transform(df['客舱'])
    12. df['登船港口'] = LabelEncoder().fit_transform(df['登船港口'])
    13. df.head()

     

     one-hot编码:

    1. # one-hot编码
    2. for column in ['登船港口','性别']:
    3. # 函数
    4. x = pd.get_dummies(df[column],prefix=column)
    5. # 拼接在一起
    6. df = pd.concat([df,x],axis=1)
    7. df.head()

     

     提取字符串里的某一部分:

    这里用到正则表达式。里面的称呼特点是都有后缀(.)

    1. df['title'] = df.姓名.str.extract('([A-Za-z]+)\.')
    2. df

     

    二、数据的横向与纵向合并

    这里进行数据重构操作

    横向合并:

    hobby1hobby2
    0gg11
    1ff22
    2gg33
    nameage
    0xx20
    1nn19
    2xx20
    nameagehobby1hobby2
    0xx20gg11
    1nn19ff22
    2xx20gg33
    1. # 导入基本库
    2. import numpy as np
    3. import pandas as pd
    4. # 载入data中的文件
    5. left_up = pd.read_csv('data/train-left-up.csv')
    6. left_down = pd.read_csv('data/train-left-down.csv')
    7. right_up = pd.read_csv('data/train-right-up.csv')
    8. right_down = pd.read_csv('data/train-right-down.csv')
    9. #将两个数据横向合并
    10. result_up = pd.concat([left_up, right_up], axis = 1)
    11. result_down = pd.concat([left_down , right_down], axis = 1)
    12. result_up.head()
    13. # 横向合并
    14. up = left_up.join(right_up)
    15. down = left_down.join(right_down)
    16. up.head()

    纵向合并:

    nameage
    0xx20
    nameage
    1nn19
    2xx20
    nameage
    0xx20
    1nn19
    2xx20
    1. # 两个数据up和down
    2. up = left_up.join(right_up)
    3. down = left_down.join(right_down)
    4. # 纵向合并
    5. result1 = up.append(down)
    6. result1.head()
    1. # 横向连接
    2. up2 = pd.merge(left_up,right_up, left_index=True, right_index=True)
    3. up2.head()
    4. down2 = pd.merge(left_down,right_down, left_index=True, right_index=True)
    5. down2.head()
    6. # 纵向合并
    7. result2 = up.append(down)
    8. result2.head()
    9. result2.shape
    10. result2.to_csv('result.csv')

     将DataFrame数据变为Series类型的数据:

    1. data = pd.read_csv('result.csv')
    2. data.head()
    3. # 转换
    4. data.stack()

    三、数据重构

    groupby函数:

    1. # 载入data文件中的:result.csv
    2. text = pd.read_csv('result.csv')
    3. text.head()
    4. # 查看性别中的0是什么:(所以女性的数据)
    5. list(text.groupby('Sex'))[0]
    6. # 找到不同性别的数据
    7. group = text.groupby('Sex')
    8. # 计算这些特征数据的统计描述
    9. print(group.describe())
    10. # 只想得到关于年龄的信息(加一个Age索引)
    11. print(text.groupby('Sex')['Age'].describe())
    12. # 只得到平均值
    13. print(text.groupby('Sex')['Age'].mean())
    14. # 计算泰坦尼克号男性与女性的平均票价
    15. # 修改索引为票价
    16. print(text.groupby('Sex')['Fare'].mean())
    17. # method__2
    18. df = text['Fare'].groupby(text['Sex'])
    19. means = df.mean()
    20. means
    21. # 统计泰坦尼克号中男女的存活人数
    22. survived_sex = text.groupby('Sex')['Survived'].sum()
    23. survived_sex = text['Survived'].groupby(text['Sex']).sum()
    24. survived_sex.head()
    25. # 计算客舱不同等级的存活人数
    26. survived_pclass = text.groupby('Pclass')['Survived'].sum()
    27. survived_pclass = text['Survived'].groupby(text['Pclass'])
    28. survived_pclass.sum()

     agg函数:

    1. # agg里面可以使用多个方法
    2. survived_pclass = text.groupby('Pclass')['Survived'].sum()
    3. survived_pclass = text.groupby('Pclass').agg({'Survived':'sum'})
    4. # 性别中对费用求平均,对存活求和
    5. text.groupby('Sex').agg({'Fare': 'mean', 'Survived': 'count'})
    6. # 重命名方便阅读,显示为‘mean_fare’
    7. text.groupby('Sex').agg({'Fare': 'mean', 'Pclass': 'count'}).rename(columns=
    8. {'Fare': 'mean_fare', 'Pclass': 'count_pclass'})
    1. # 统计在不同等级的票中的不同年龄的船票花费的平均值
    2. # 再加一个Pclass
    3. text.groupby(['Pclass','Age'])['Fare'].mean().head()
    1. # 将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
    2. # 使用index查看列索引,相同则可以合并
    3. # 我在上面没有赋值,使用这个元素不存在
    4. means.index
    5. survived_sex.index
    6. # 确定类型,使用merge不能是series
    7. type(means)
    8. # 变为dataframe
    9. means.to_frame()
    10. # 保存起来使用merge
    11. result = pd.merge(means,survived_sex,on='Sex')
    12. result
    13. result.to_csv('sex_fare_survived.csv')
    1. # 得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数
    2. #不同年龄的存活人数
    3. text.groupby(['Age'])['Survived'].sum()
    4. survived_age = text['Survived'].groupby(text['Age']).sum()
    5. survived_age.head()
    6. #找出最大值的年龄段
    7. survived_age[survived_age.values==survived_age.max()]
    8. #首先计算总人数
    9. _sum = text['Survived'].sum()
    10. print("sum of person:"+str(_sum))
    11. precetn =survived_age.max()/_sum
    12. print("最大存活率:"+str(precetn))

     四、数据可视化

    1. import numpy as np
    2. import pandas as pd
    3. # 画图用
    4. import matplotlib.pyplot as plt
    5. text = pd.read_csv(r'result.csv')
    6. text.head()
    7. # 男女中生存人数分布情况
    8. sex = text.groupby('Sex')['Survived'].sum()
    9. # 柱状图bar
    10. sex.plot.bar()
    11. # 标题
    12. plt.title('survived_count')
    13. plt.show()

     

    1. # 男女中生存人与死亡人数的比例图
    2. # unstack:旋转数据,转置
    3. s = text.groupby(['Sex','Survived'])['Survived'].count().unstack()
    4. # 绘制男女死亡人数柱状图
    5. died = s[0]
    6. died.plot.bar()
    7. plt.title('died')

     

    s.plot.bar()

    1. # 提示:计算男女中死亡人数 1表示生存,0表示死亡
    2. # 柱子叠起来,参数:stacked='True'
    3. text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
    4. plt.title('survived_count')
    5. plt.ylabel('count')

    1. # 查看不同票价的生存死亡人数
    2. c = text.groupby(['Fare','Survived'])['Survived'].count().unstack()
    3. c
    4. c.plot()

    1. # 1表示生存,0表示死亡
    2. # 不同仓位等级的人生存和死亡人员的分布情况
    3. pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
    4. pclass_sur
    5. import seaborn as sns
    6. sns.countplot(x="Pclass", hue="Survived", data=text)

    1. # 不同年龄的人生存与死亡人数分布情况
    2. # 0表示死亡人数,1生存。不同年龄的死亡人数
    3. # 画频率直方图。分区间:bins; alpha :颜色透明度
    4. # density密度
    5. text.Age[text.Survived == 0].hist(bins=5, alpha = .5, density=1)
    6. text.Age[text.Survived == 1].hist(bins=5,alpha = .5, density=1)
    7. # 密度曲线
    8. text.Age[text.Survived == 0].plot.density()
    9. text.Age[text.Survived == 1].plot.density()
    10. # 图例
    11. plt.legend((0,1))
    12. plt.xlabel('age')
    13. # plt.ylabel('count')
    14. plt.ylabel('density')

     

    1. # 参考代码
    2. facet = sns.FacetGrid(text, hue="Survived",aspect=3)
    3. facet.map(sns.kdeplot,'Age',shade= True)
    4. facet.set(xlim=(0, text['Age'].max()))
    5. facet.add_legend()

    1. # 不同仓位等级的人年龄分布情况
    2. # 查看种类
    3. unique_placss = text.Pclass.unique()
    4. print(unique_placss)
    5. for i in unique_placss:
    6. # 密度曲线
    7. text.Age[text.Pclass == i].plot.density()
    8. # 图例
    9. plt.legend(unique_placss)
    10. plt.xlabel('age')
    11. # plt.ylabel('count')
    12. plt.ylabel('density')

     

    1. import seaborn as sns
    2. for i in unique_placss:
    3. # 密度曲线
    4. sns.kdeplot(text.Age[text.Pclass == i])
    5. # 不同仓位等级的人年龄分布情况
    6. text.Age[text.Pclass == 1].plot(kind='kde')
    7. text.Age[text.Pclass == 2].plot(kind='kde')
    8. text.Age[text.Pclass == 3].plot(kind='kde')
    9. plt.xlabel("age")
    10. plt.legend((1,2,3),loc="best")
  • 相关阅读:
    Ansible自动化运维工具(三)
    使用postman测试
    CV:阿里在CV数据增强领域带来SOTA新范式(已被NeurIPS2022接收)—基于离散化对抗训练的鲁棒视觉新基准!
    阿里云服务器(Ubuntu22)上的MySQL8更改为大小写不敏感
    通俗易懂的==和equals()的使用
    uniapp常见兼容性问题
    模拟量信号干扰的主要原因及解决方案
    Pandas分组聚合_Python数据分析与可视化
    【Python Web】Flask框架(三)CSS案例应用及样式模板的使用
    葡萄糖-聚乙二醇-异硫氰基荧光素 FITC-PEG-Glucose
  • 原文地址:https://blog.csdn.net/m0_63807165/article/details/136692783