Python每日一记193>>>AttributeError: 'DataFrame' object has no attribute 'map'

2023-10-27

昨天在运行一段程序的时候,遇到了AttributeError: ‘DataFrame’ object has no attribute 'map’错误,但是很奇怪,明明之前也是类似的代码,不知道这次为什么出错了。
先看一下错误
在这里插入图片描述
发现错误发生的代码在以下这一句:

data_ks.loc[:, '区域段'] = data_ks.loc[:,'区域'].map(region_rule)

但是怎么想也觉得不对,因为明明data_ks.loc[:,‘区域’]就是选中的一列啊,不应该是DataFrame啊,于是再往上追溯:

gr_info=pd.concat([gr_kb,gr_age,gr_region,gr_region],axis=1,join='outer')

注意gr_region合并了两次,是我写错了,就导致有两个区域列,于是我们虽然是data_ks.loc[:,‘区域’],但是因为有两列区域列,就导致选出的是两列,也就是一个DataFrame,所以才报错,修改一下:

gr_info=pd.concat([gr_kb,gr_age,gr_region,gr_male],axis=1,join='outer')

这样就不会报错了。
总结一下,AttributeError: ‘DataFrame’ object has no attribute ‘map’错误,我们应该关注的点在于’DataFrame’ object和map,首先去检查是否是’DataFrame’ object,其次再去检查有没有map的属性,这样就能解决问题了。
网上有这个错误的其他解决方案,比如更新pandas等,但是感觉没有聚焦到问题本身,也就是应该专注于’DataFrame’ object,看看你进行操作的对象是否是’DataFrame’ object,再者才是应该关注’DataFrame’ object是否有map属性方法。

最后给上全部代码:

import numpy as np
import pandas as pd
import xlwings as xw
from pandas.api.types import CategoricalDtype  # 弥补astype的不足
# data_2015=pd.read_excel('E:\\ywj严文杰备份\\带时间消费明细-持续更新\\15年消费明细.xlsx')
# data_2016=pd.read_excel('E:\\ywj严文杰备份\\带时间消费明细-持续更新\\16年消费明细.xlsx')
# data_2017=pd.read_excel('E:\\ywj严文杰备份\\带时间消费明细-持续更新\\17年消费明细.xlsx')
data_2018=pd.read_excel('E:\\ywj严文杰备份\\带时间消费明细-持续更新\\18年消费明细.xlsx')
data_2019=pd.read_excel('E:\\ywj严文杰备份\\带时间消费明细-持续更新\\19年-1130.xlsx')
data=pd.concat([data_2018,data_2019],axis=0)

# 获取最终卡别,最终年龄,最终区域,最终性别
def get_info(d1):
    data1=d1
    # 卡别
    data_kb = data1.dropna(subset=['卡别'])
    # data_kb = data1
    gr_kb = data_kb[['卡号', '交易时间', '卡别']].groupby(by=['卡号']).apply(lambda x: x.sort_values(by='交易时间').iloc[-1, 2])
    gr_kb = pd.DataFrame(gr_kb)
    gr_kb.index.name = '索引'
    # gr_kb['卡号'] = gr_kb.index.tolist()
    gr_kb.columns = ['卡别']

    # 年龄
    data_age=data1.dropna(subset=['年龄'])
    # data_age=data1
    gr_age = data_age[['卡号', '交易时间', '年龄']].groupby(by=['卡号']).apply(lambda x: x.sort_values(by='交易时间').iloc[-1, 2])
    gr_age = pd.DataFrame(gr_age)
    gr_age.index.name = '索引'
    # gr_age['卡号'] =  gr_age.index.tolist()
    gr_age.columns = ['年龄']

    # 区域
    data_region=data1.dropna(subset=['区域'])
    gr_region = data_region[['卡号', '交易时间', '区域']].groupby(by=['卡号']).apply(lambda x: x.sort_values(by='交易时间').iloc[-1, 2])
    gr_region = pd.DataFrame(gr_region)
    gr_region.index.name = '索引'
    # gr_region['卡号'] =  gr_region.index.tolist()
    gr_region.columns = ['区域']

    # 性别
    # 男女编码
    data_male=data1.dropna(subset=['性别'])
    rule = {0: '男', 1: '女'}  # 创建字典
    data_male.loc[:,'性别'] = data_male.loc[:,'性别'].map(rule)  # 叫做映射
    gr_male = data_male[['卡号', '交易时间', '性别']].groupby(by=['卡号']).apply(lambda x: x.sort_values(by='交易时间').iloc[-1, 2])
    gr_male = pd.DataFrame(gr_male)
    gr_male.index.name = '索引'
    # gr_male['卡号'] =  gr_male.index.tolist()
    gr_male.columns = ['性别']

    # 合并
    gr_info=pd.concat([gr_kb,gr_age,gr_region,gr_male],axis=1,join='outer')
    gr_info['卡号']=gr_info.index.tolist()
    return gr_info

# 年龄编码,和卡别合并
def get_mingxi(d1,start,end,name):
    data1=d1
    data1['日期'] = pd.to_datetime(list(map(lambda x: x.date(), data1.loc[:, '交易时间'])))  # 转化为按天计算的日期
    data2 = data1.loc[(data1['日期'] >= pd.to_datetime(start)) & (data1['日期'] <= pd.to_datetime(end))]

    # 循环课室
    ks1 = data_2019.loc[~data_2019['课室'].isin(['人力资源部','超级市场课', '贩卖促进部', '店长办公室']), '课室'].drop_duplicates()
    for ks in ks1:
        data_ks = data2.loc[data2['课室'] == ks]
        data_info=get_info(data_ks)
        # 多对一merge
        data_ks=pd.merge(data_ks.loc[:,['卡号','交易时间','日期','专柜','部类','课室','销售金额']],data_info,how='left',on='卡号')
        data_ks['销售金额-求客单'] = data_ks['销售金额']
        # 年龄段编码
        if start[0:3] == '2018':
            data_ks['年龄'] = data_ks['年龄'] - 1
        # 开始编码分类等
        # 空的不会出错也不会编码,还是空,最后在填充即可
        # 直接编码替换
        data_ks['年龄段'] = pd.cut(data_ks['年龄'], [0, 20, 25, 30, 35, 40, 50, float('inf')],
                                 labels=['<=20岁', '21-25岁', '26-30岁', '31-35岁', '36-40岁', '41-50岁', '>50岁'])

        # 区域分类,有点多
        key1 = ['金牛区', '锦江区', '青羊区', '武侯区', '成华区', '龙泉驿区', '天府新区', '高新区', '双流区', '温江区', '郫都区', '新都区',
                '青白江区', '崇州市', '邛崃市', '大邑县', '新津县', '浦江县', '彭州市', '都江堰市', '金堂县',
                '巴中市', '遂宁市', '眉山市', '绵阳市', '乐山市', '泸州市', '自贡市', '资阳市', '雅安市', '甘孜阿垻', '德阳市', '广元市', '达州市', '南充市',
                '凉山彝族自治州', '内江市', '广安市', '宜宾市', '攀枝花市', '广汉市',
                '重庆',
                '其他']
        value1 = ['金牛区', '锦江区', '青羊区', '武侯区', '成华区', '龙泉驿区', '天府新区', '高新区', '双流区', '温江区', '郫都区', '新都区',
                  '成都郊县', '成都郊县', '成都郊县', '成都郊县', '成都郊县', '成都郊县', '成都郊县', '成都郊县', '成都郊县',
                  '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市',
                  '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市', '省内其他市',
                  '重庆',
                  '其他']
        region_rule = {key: value for key, value in zip(key1, value1)}  # 创建字典,注意zip的使用
        data_ks.loc[:, '区域段'] = data_ks.loc[:,'区域'].map(region_rule)



        # 卡别自定义排序
        data_ks['卡别'] =  data_ks['卡别'] .astype( CategoricalDtype(categories=['微会员', '金卡', '红宝石卡', '钻石卡'], ordered=True))

        # 年龄段自定义排序
        data_ks['年龄段'] = data_ks['年龄段'].astype(CategoricalDtype(categories=['<=20岁', '21-25岁', '26-30岁', '31-35岁', '36-40岁', '41-50岁', '>50岁'], ordered=True))

        # 区域段自定义排序
        data_ks['区域段'] = data_ks['区域段'].astype(CategoricalDtype(
            categories=['金牛区', '锦江区', '青羊区', '武侯区', '成华区', '龙泉驿区', '天府新区', '高新区', '双流区', '温江区', '郫都区', '新都区',
                        '成都郊县', '省内其他市', '重庆', '其他'], ordered=True))

        # 性别自定义排序
        data_ks['性别'] = data_ks['性别'] .astype(CategoricalDtype(categories=['男', '女'], ordered=True))

        #卡别分组
        data_ks_gr_kb=data_ks.groupby(by=['部类','专柜','卡别']).agg({'卡号':lambda x:len(set(x)),'销售金额':np.sum,'销售金额-求客单': np.mean})
        data_ks_gr_kb.index.name='卡别维度'
        data_ks_gr_kb.columns=['客数','销售金额','客单']

        # 年龄分组
        data_ks_gr_age = data_ks.dropna(subset=['年龄段']).groupby(by=['部类', '专柜', '年龄段']).agg({'卡号': lambda x: len(set(x)), '销售金额': np.sum, '销售金额-求客单': np.mean})
        data_ks_gr_age.index.name = '年龄维度'
        data_ks_gr_age.columns = ['客数', '销售金额', '客单']

        # 区域分组
        data_ks_gr_region = data_ks.dropna(subset=['区域段']).groupby(by=['部类', '专柜', '区域段']).agg(
            {'卡号': lambda x: len(set(x)), '销售金额': np.sum, '销售金额-求客单': np.mean})
        data_ks_gr_region.index.name = '区域维度'
        data_ks_gr_region.columns = ['客数', '销售金额', '客单']

        # 性别分组
        data_ks_gr_male = data_ks.dropna(subset=['性别']).groupby(by=['部类', '专柜', '性别']).agg(
            {'卡号': lambda x: len(set(x)), '销售金额': np.sum, '销售金额-求客单': np.mean})
        data_ks_gr_male.index.name = '性别维度'
        data_ks_gr_male.columns = ['客数', '销售金额', '客单']

        # 保存excel
        writer= pd.ExcelWriter(r'C:\Users\02180085\Desktop\python品牌细化分析\{}-2019年{}品牌细化分析.xlsx'.format(ks,name))
        data_ks_gr_kb.to_excel(writer,sheet_name='卡别维度')
        data_ks_gr_age.to_excel(writer, sheet_name='年龄维度')
        data_ks_gr_region.to_excel(writer, sheet_name='区域维度')
        data_ks_gr_male.to_excel(writer, sheet_name='性别维度')
        writer.save()
        writer.close()

get_mingxi(data, '2019-11-1', '2019-11-30','11月')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python每日一记193>>>AttributeError: 'DataFrame' object has no attribute 'map' 的相关文章

  • Whitted-Style 光线追踪

    Whitted Style 光线追踪 生成相机光线 定义光线 每条光线相当于一条射线 具有两个固定属性 起点o以及方向d 此外参数t表示光线的长度 本节中所学习的光线类型为摄影机光线或主光线 对图像中的每一个像素 我们需要构造一条相机射线
  • Eggjs笔记:关系型数据库表之间的关系

    关系数据库中表与表的 3 种关系 1 一对一的关系 一个人对应一个唯一的身份证号 一个人对应一个唯一的驾驶证 一篇文章对应一个文章详情 如上图 一篇文章对应一个文章详情 本来可以是一张表 拆分成2张表 文章表用于存储一些通用的字段信息 文章
  • 教妹学Java(二十一):一文带你了解面向对象编程的所有概念

    你好呀 我是沉默王二 是 Web 全栈开发进阶之路 的作者 CSDN 的博客之星 教妹学 Java 是一套非常有趣的付费专栏 除了继续保持幽默风趣的行风风格 我还力求把每一个知识点讲得透彻明白 保证你可以从中受益 成为一名优秀的 Java
  • Request 详解

    1 Request对象 在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象 2 get和post请求区别 get请求 get提交的数据会放在URL之后 以 分割URL和传输数据 参数之间以 相连 ge
  • 简单易懂的 flex 布局技巧:前面盒子左对齐,后面盒子右对齐

    前言 页面布局的灵活性和效果直接影响着用户的使用体验 而在实现页面布局时 我们通常会使用 css 的布局方式来进行设计 其中 flex 布局作为一种比较新的布局方式 其灵活性和效果备受开发者的青睐 在这里 我将为大家介绍如何使用 flex
  • matlab学习:regress函数、stepwise函数、lasso函数

    做数据量化推理的大作业 考虑了几种回归模型 由于网上的资料并不多 只能借鉴部分信息 再加上自己的尝试 算是学会了matlab中regress stepwise lasso三个函数的一些用法 分享出来 先分享下有关regress函数的内容 g
  • C++模板基础(九)

    完美转发与 lambda 表达式模板 void f int input std cout lt lt void f int input t lt lt input lt lt n void f int input std cout lt l
  • springboot注入第三方jar包的类

    原文链接 https blog csdn net qq 22855003 article details 89843640 比如我们要注入第三方jar包里的CrawlerTask1 CrawlerTask2这个两个类 因为这两个类上没有被
  • JUC并发编程设计模式

    一 保护性暂停 1 1 定义 即Guarded Suspension 用在一个线程等待另一 个线程的执行结果 要点 有一个结果需要从一个线程传递到另一 个线程 让他们关联同一一个GuardedObject 如果有结果不断从一个线程到另一个线
  • Hadoop集群搭建【web端不显示从节点问题】

    系统 CentOS7 环境 jdk8 版本 hadoop 2 7 7 结构 hadoop01 namedata nodedata hadoop02 nodedata hadoop03 nodedata 配置 hadoop 2 7 7 etc
  • 数仓模型理论

    1 数仓介绍 2 建模理论 建模的目标 性能 成本 效率 数据质量中找到平衡点 2 0 三范式 123要求逐渐严格 每一列不可分割 属性要完全依赖于主键 不可以只依赖一部分 数据重复很多 案例中主键是学生id和课程 所属系和系主任只依赖学生
  • qt的QListwiget设置横向的排列

    cpp view plain copy contentsWidget new QListWidget contentsWidget gt setViewMode QListView IconMode contentsWidget gt se
  • MyBatis映射文件与核心配置文件

    目录 1 Mapper 映射文件 2 POJO类 3 Junit测试代码 4 MyBatis 配置文件详解 5 mapper 映射配置文件详解 1 Mapper 映射文件 在 MyBatis 中 推荐使用 mapper 作为包名 我们只需要
  • LeetCode 53. Maximum Subarray 最大连续字段和问题

    考察 最大连续字段和问题 解决问题时间复杂度 O n 问题隐含条件 如果给出的数集都是负数 那么最大连续字段和就是 最大的那个负数 eg 2 1 结果应该输出 1 而不是 0 int maxSubArray int nums int num
  • vue中 $event 的用法--获取当前父元素,子元素,兄弟元素

    vue中 event 的用法 获取当前父元素 子元素 兄弟元素
  • opencv-python常见方法使用教程(一)

    文章目录 一 OpenCV是什么 二 使用步骤 1 安装 2 读取图片 方式一 方式二 3 保存图片 4 图像的基本操作 像素操作 图像切割 图像平移 图像旋转缩放 图片大小调整 总结 一 OpenCV是什么 OpenCV是一个基于BSD许
  • springboot入门

    文章目录 springboot入门 1 spring boot简介 2 微服务 3 环境搭建 1 maven配置 2 sprintboot HelloWord 1 创建一个maven工程 jar 2 导入spring boot相关依赖 3
  • CCNP的考试是中文还是英文?

    思科的所有考试都是英文 虽然CCNP的考试对考生的学历 专业没什么要求 但是它的考试是全英文考试 如果你的英语水平太糟糕的话 不太建议你考 不然的话很可能连考试题目都看不懂 CCNP培训费用 分两种情况 线上 3000左右 线下 线下的两倍
  • 【JAVA】id:‘org.springframework.boot‘, version:‘2.3.3.RELEASE‘] was not found in any of the following

    以下内容 均为治疗下载不了gradle的包的问题 gradle 加载新引入的项目 然后下载包报错 id org springframework boot version 2 3 3 RELEASE was not found in any
  • 用element-ui渲染一个二级数据表格即复杂表格,并且自定标题

    最终完成的效果 废话不多说 直接上代码 不懂来问

随机推荐