• python数据分析-面试题


    # 设逾期表为df,格式为pandas.DataFrame,详细数据如下所示,其中order_no为非
    # 重复订单号,overdue_days为逾期天数,info_tabel为逾期标签,其中1表示逾期,
    # 0表示未逾期
    
    
    1. # 设逾期表为df,格式为pandas.DataFrame,详细数据如下所示,其中order_no为非
    2. # 重复订单号,overdue_days为逾期天数,info_tabel为逾期标签,其中1表示逾期,
    3. # 0表示未逾期
    4. import pandas as pd
    5. import numpy as np
    6. from IPython.display import display
    7. df = pd.DataFrame({
    8. 'order_no':['order_18213','order_16061','order_10176','order_11923','order_18791','order_12534','order_14502','order_14488','order_15488','order_18118'],
    9. 'province':['山东','四川','福建','广东','广东','广东','广东','山东','湖南','福建',],
    10. 'gender':[ '女', '女', '女', '女', '男', '女', '男', '男', '女', '女'],
    11. 'age':[ 29.0, 27.0, 25.0, 25.0,np.nan, 27.0, 25.0, 27.0,np.nan, 27.0],
    12. 'education':[ '本科', '研究生', '本科', '研究生', '研究生', '本科', '大专', '大专', '本科', '大专'],
    13. 'overdue_days':[ 0, 17, 0, 0, 12, 20, 22, 32, 0, 2],
    14. 'info_label':[ 0, 1, 0, 0, 1, 1, 1, 1, 0, 1]
    15. })
    16. display(df)

    # 题目1:将gender列中的 男 ,女分别替换为数值1、0
    1. # 题目1:将gender列中的 男 ,女分别替换为数值1、0
    2. # 【方法1】
    3. df['gender'] = df['gender'].map({'男':1,'女':0})
    4. display(df)
    5. # 【方法2】
    6. # df['gender'] = df['gender'].replace(['男','女'],[1,0])
    7. # display(df)
    8. # 【方法3】
    9. # df.loc[df['gender']=='男','gender'] = 1
    10. # df.loc[df['gender']=='女','gender'] = 0
    11. # display(df)

     

    # 注意df.loc用法:
    # df.loc[行标签,列标签]
    # df.loc['a':'b']#选取ab两行数据
    # df.loc[:,'one']#选取one列的数据
    
    # 题目2:将age列的缺失值用age列的均值代替
    1. # 题目2:将age列的缺失值用age列的均值代替
    2. # 使用fillna填补缺失值即可
    3. df_mean = df['age'].mean()
    4. df['age'].fillna(df_mean,inplace=True)
    5. print(df)

    # 题目3:计算各省的平均逾期率
    # 逾期率=逾期客户/全部客户
    1. # 题目3:计算各省的平均逾期率
    2. # 逾期率=逾期客户/全部客户
    3. # 计算各省的逾期用户
    4. df_overdue = df.groupby('province')['info_label'].sum().reset_index()
    5. df_overdue.columns=['province', 'overdue_cnt']
    6. # display(df_overdue)
    7. # 计算各省的用户数
    8. df_all = df.groupby('province')['info_label'].count().reset_index()
    9. df_all.columns=['province', 'all_cnt']
    10. # display(df_all)
    11. # 合并各省逾期用户及各省用户数形成新的报表df1
    12. df1 = pd.merge(df_overdue,df_all,on=['province'],how='left')
    13. # 得到各省的逾期率
    14. df1['overdue_pec'] = df1['overdue_cnt']/df1['all_cnt']
    15. display(df1)

     

    # 题目4:计算广东省男性用户的逾期率
    
    1. # 题目4:计算广东省男性用户的逾期率
    2. # 计算广东省的逾期男性用户的人数
    3. overdue_maleCount = df[(df['province']=='广东') & (df['gender']== 1)]['info_label'].sum()
    4. overdue_allMaleCount = df[(df['province']=='广东') & (df['gender']== 1)]['info_label'].count()
    5. overdue_pec_gd = overdue_maleCount / overdue_allMaleCount
    6. display(overdue_pec_gd)
    # 题目5:在df里面新增1列overdue_grade,其中
    #       overdue_days<15时,overdue_grade取值为A,
    #       overdue_days>=15时 overdue_grade取值为B
    1. # 题目5:在df里面新增1列overdue_grade,其中
    2. # overdue_days<15时,overdue_grade取值为A,
    3. # overdue_days>=15时 overdue_grade取值为B
    4. df['over_grade'] = df['overdue_days'].apply(lambda x: 'A' if x < 15 else'B')
    5. display(df)

    # 题目6:将类别型变量education 转化为哑变量(Dummy Variables),
    # 并与原df在axis=1 方向上合并,然后删除初始的education列
    
    1. # 题目6:将类别型变量education 转化为哑变量(Dummy Variables),
    2. # 并与原df在axis=1 方向上合并,然后删除初始的education列
    3. # 使用get_dummies进行one-hot变量,然后进行数据合并concat,删除使用drop
    4. df=pd.concat((df,pd.get_dummies(df['education'])),axis=1)
    5. print(df)
    6. df = df.drop(['education'],axis=1)
    7. print(df)

     >>注意:在Jupyter环境下运行的代码,dataframe表格怎么对齐?

    1. from IPython.display import display
    2. display(df)

     >>使用pandas数据处理数据,最好用的函数搭配:apply+lambda

    1. #函数应用和映射
    2. import numpy as np
    3. import pandas as pd
    4. df=pd.DataFrame(np.random.randn(4,5)*10,columns=list('ABCDF'),index=['1','2','3','4'])
    5. display(df)

     

    知识点补充: 

    1. d1 = df.apply(lambda x: x.max()-x.min())
    2. display(d1)

    1. d2 = df.apply(lambda x: x.max()-x.min(),axis=1)
    2. display(d2)

     

    1. # 浮点值保留两位小数
    2. d3=df['B'].map(lambda x: '%.2f'%x)
    3. display(d3)

     

    1. d4=df.applymap(lambda x: '%.2f'%x)['B']
    2. display(d4)

     

    lambda 参数:操作(参数)

    #单个参数的:
    h = lambda x : x ** 2
    print(h(3)) # 9

    #多个参数的:
    h = lambda x, y, z : (x + y) ** z
    print(h(1,2,2)) # 9

    map(lambda x : x + 1, [1, 2, 3]) # [2,3,4]

    map(lambda x: x*x, [y for y in range(10)]) #将一个 list 里的每个元素都平方

    (lambda x,y: x if x> y else y)(101,102) # 102

    >> 保存dataFrame数据到excel文件

    1. import pandas as pd
    2. import numpy as np
    3. df = pd.DataFrame({
    4. 'order_no':['order_18213','order_16061','order_10176','order_11923','order_18791','order_12534','order_14502','order_14488','order_15488','order_18118'],
    5. 'province':['山东','四川','福建','广东','广东','广东','广东','山东','湖南','福建',],
    6. 'gender':[ '女', '女', '女', '女', '男', '女', '男', '男', '女', '女'],
    7. 'age':[ 29.0, 27.0, 25.0, 25.0,np.nan, 27.0, 25.0, 27.0,np.nan, 27.0],
    8. 'education':[ '本科', '研究生', '本科', '研究生', '研究生', '本科', '大专', '大专', '本科', '大专'],
    9. 'overdue_days':[ 0, 17, 0, 0, 12, 20, 22, 32, 0, 2],
    10. 'info_label':[ 0, 1, 0, 0, 1, 1, 1, 1, 0, 1]
    11. })
    12. print(df)
    13. tmp_file_path='test.xlsx'
    14. writer = pd.ExcelWriter(tmp_file_path)
    15. df.to_excel(writer, sheet_name=tmp_file_path.split('.')[0],index= False)
    16. worksheet = writer.sheets[tmp_file_path.split('.')[0]]
    17. worksheet.set_column(0,1, 35) #指定第1-2列为35像素宽度
    18. worksheet.set_column(2,13, 10) #指定第3-13列为10像素宽度
    19. writer.save()

    >>pandas读取excel文件的数据

    1. import pandas as pd
    2. df = pd.read_excel("test.xlsx")
    3. print("\n(1)全部数据:")
    4. print(df.iloc[:,:].values)
    5. print("\n(2)第2行第3列的值:")
    6. print(df.iloc[1,2])
    7. print("\n(3)第3行数据:")
    8. print(df.iloc[2].values)
    9. print("\n(4)第2列数据:")
    10. print(df.iloc[:,1].values)
    11. print("\n(5)第6行的education:")
    12. print(df.loc[5,"education"])
    13. print("\n(6)第2至3行、第3至4列数据:")
    14. print(df.iloc[1:3,2:4].values)

     

     

  • 相关阅读:
    CLion远程Linux开发环境搭建及找不到Linux头文件的解决方法
    【Stream】Java中List<Object>,List<~> 使用Stream函数式
    193页5万字智慧物流园解决方案
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    kubesphere 一键部署K8Sv1.21.5版本
    Android 静态代码检查
    ssh-keygen和openssl的区别
    全新彩虹商城时光模板知识付费系统源码+内有5000多商品+易支付源码
    Prometheus----3
    unity3d中单例模式两种简单写法与对比
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/126874868