Pandas:从一个DataFrame中直接索引赋值到另一个索引位置出错的Bug及其解决方案

这里写自定义目录标题

  • 动机
    • 代码1,这个代码是有问题的
    • 代码2,这个代码是我调试代码。拆分代码,最后找到问题所在,这个代码是正确的
    • 代码3。本以为找到问题所在之后,又稍微修改了下代码 2,这个代码还是没问题的
    • 代码4。本以为找到问题所在之后,又稍微修改了下代码 1,这个代码还是没问题的

动机

今天写代码,处理通量站数据的时候出错。代码逻辑没问题,但是就是得不到想要的结果,然后做个笔记。可能问题是我自己遇到的,在这里其他人也没经历,所以也看不懂。总体而言:Pandas:从一个DataFrame中直接索引赋值到另一个索引位置出错。必须使用一个中间变量去固定。虽然解决了问题,好像还是不知道为什么。我尝试过换python 版本(3.7 和 3.10),但是没用。

代码1,这个代码是有问题的

import pandas as pd
import numpy as np

# 假设 siteData_reindexed 是你的 DataFrame
# 这里是一个示例 DataFrame
# siteData_reindexed = pd.DataFrame({
#     'SW_IN': [np.nan, 1, 2, np.nan, 4, np.nan, 6, 7, 8, 9, 10, np.nan],
#     'LW_IN': [1, 2, np.nan, 4, np.nan, 6, 7, np.nan, 9, 10, np.nan, 12],
#     'WS': [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
# }, index=pd.date_range(start="2019-06-26 14:00:00", end="2020-11-17 10:00:00", freq='60min'))

# 计算每天的缺失值比例
rad_daily_miss_rate = siteData_reindexed[["SW_IN", "LW_IN"]].resample('D').apply(lambda x: x.isnull().mean())

# 创建一个新的 DataFrame 来存储填补后的数据
filled_data = siteData_reindexed.copy()

# 遍历每天的缺失值比例
for date, ratios in rad_daily_miss_rate.iterrows():
    print("##" * 30)
    sw_in_ratio = ratios['SW_IN']
    lw_in_ratio = ratios['LW_IN']

    print(date, sw_in_ratio, lw_in_ratio)
    print("前:")
    print(filled_data.loc[date - pd.Timedelta(hours=1): date + pd.Timedelta(hours=23), ["SW_IN", "LW_IN"]])

    # 检查缺失比例
    if sw_in_ratio == 0 and lw_in_ratio == 0:
        print("没有参加填补")
        # 如果缺失比例为0,什么都不做
        continue
    elif sw_in_ratio < 0.4 and lw_in_ratio < 0.4:
        # 如果缺失比例小于40%,使用 .ffill() 和 .bfill() 填补当天的 'SW_IN' 和 'LW_IN'
        filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']] = filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']].ffill().bfill()
    else:
        # 否则,使用前一天的24小时数据填补 'SW_IN' 和 'LW_IN'
        previous_day = date - pd.Timedelta(days=1)
        if previous_day in filled_data.index:
            print(f"填补前一天的数据: {previous_day}")
            print(filled_data.loc[previous_day:previous_day + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']])
            # 这里就是问题所在的位置
            filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']] = filled_data.loc[previous_day:previous_day + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']]
        else:
            print(f"前一天 {previous_day} 的数据不存在")

    print("后:")
    print(filled_data.loc[date - pd.Timedelta(hours=1): date + pd.Timedelta(hours=23), ["SW_IN", "LW_IN"]])

# 结果
# print(filled_data)

问题出在这里 filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']] = filled_data.loc[previous_day:previous_day + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']]。必须使用一个中间变量去将数值固定,否则在内存中索引,会匹配错误。我是这么理解的。可能也是我写代码习惯不太好。

代码2,这个代码是我调试代码。拆分代码,最后找到问题所在,这个代码是正确的

"""

"""

# 计算每天的缺失值比例
rad_daily_miss_rate = siteData_reindexed[["SW_IN","LW_IN"]].resample('D').apply(lambda x: x.isnull().mean())

# 创建一个新的 DataFrame 来存储填补后的数据
filled_data= siteData_reindexed.copy()

# 遍历每天的缺失值比例
for date, ratios in rad_daily_miss_rate.iterrows():

    if date <= pd.Timestamp("2019-06-29 23:00:00") :

        sw_in_ratio = ratios['SW_IN']
        lw_in_ratio = ratios['LW_IN']

        # 检查缺失比例
        if sw_in_ratio == 0 and lw_in_ratio == 0:
            print("没有参加填补")
            # 如果缺失比例为0,什么都不做
            continue
        elif sw_in_ratio < 0.4 and lw_in_ratio < 0.4:
            print("进入  sw_in_ratio < 0.4 and lw_in_ratio < 0.4 ")
            # 如果缺失比例小于30%,使用 .ffill() 和 .bfill() 填补当天的 'SW_IN' 和 'LW_IN'
            filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']] = filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']].ffill().bfill()
        else:
            print("进入 else")
            # 否则,使用前一天的24小时数据填补 'SW_IN' 和 'LW_IN'
            # 这个放置位置的索引
            timeRange = pd.date_range(start= date, end=date + pd.Timedelta(days=1), freq='60min')
            for date_index in timeRange:

                # 确保匹配到的是前一天的数据
                print(f"date_index: {date_index}")
                # 必须使用一个中间变量去将数值固定,否则在内存中索引,会匹配错误
                previous_day_value = siteData_reindexed.loc[date_index - pd.Timedelta(days=1), ['SW_IN', 'LW_IN']]
                print(f"前一天数据: {previous_day_value}")

                # 检查是否能成功填充
                filled_data.loc[date_index, ['SW_IN', 'LW_IN']] = previous_day_value
                print(f"填补后的数据: {filled_data.loc[date_index, ['SW_IN', 'LW_IN']]}")

        print("后:")
        print(filled_data.loc[date:date + pd.Timedelta(hours=23),["SW_IN","LW_IN"]])
# 结果
# print(filled_data)

代码3。本以为找到问题所在之后,又稍微修改了下代码 2,这个代码还是没问题的

"""

"""

# 计算每天的缺失值比例
rad_daily_miss_rate = siteData_reindexed[["SW_IN","LW_IN"]].resample('D').apply(lambda x: x.isnull().mean())

# 创建一个新的 DataFrame 来存储填补后的数据
filled_data= siteData_reindexed.copy()

# 遍历每天的缺失值比例
for date, ratios in rad_daily_miss_rate.iterrows():

    if date <= pd.Timestamp("2019-06-29 23:00:00") :

        sw_in_ratio = ratios['SW_IN']
        lw_in_ratio = ratios['LW_IN']

        # 检查缺失比例
        if sw_in_ratio == 0 and lw_in_ratio == 0:
            print("没有参加填补")
            # 如果缺失比例为0,什么都不做
            continue
        elif sw_in_ratio < 0.4 and lw_in_ratio < 0.4:
            print("进入  sw_in_ratio < 0.4 and lw_in_ratio < 0.4 ")
            # 如果缺失比例小于30%,使用 .ffill() 和 .bfill() 填补当天的 'SW_IN' 和 'LW_IN'
            filled_data.loc[date:date + pd.Timedelta(days=1), ['SW_IN', 'LW_IN']] = filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']].ffill().bfill()
        else:
            print("进入 else")
            # 否则,使用前一天的24小时数据填补 'SW_IN' 和 'LW_IN'
            # 变量前一天
            previous_day = date - pd.Timedelta(days=1)
            # 前一天的数据
            previous_day_data = siteData_reindexed.copy().loc[previous_day:date, ['SW_IN', 'LW_IN']]

            filled_data.loc[date:date + pd.Timedelta(days=1), ['SW_IN', 'LW_IN']] = previous_day_data

            # 这个放置位置的索引
            # timeRange = pd.date_range(start= date, end=date + pd.Timedelta(days=1), freq='60min')
            # for date_index in timeRange:
            #
            #     # 确保匹配到的是前一天的数据
            #     print(f"date_index: {date_index}")
            #     # 必须使用一个中间变量去将数值固定,否则在内存中索引,会匹配错误
            #     previous_day_value = siteData_reindexed.loc[date_index - pd.Timedelta(days=1), ['SW_IN', 'LW_IN']]
            #     print(f"前一天数据: {previous_day_value}")
            #
            #     # 检查是否能成功填充
            #     filled_data.loc[date_index, ['SW_IN', 'LW_IN']] = previous_day_value
            #     print(f"填补后的数据: {filled_data.loc[date_index, ['SW_IN', 'LW_IN']]}")

        print("后:")
        print(filled_data.loc[date:date + pd.Timedelta(hours=23),["SW_IN","LW_IN"]])
# 结果
# print(filled_data)

代码4。本以为找到问题所在之后,又稍微修改了下代码 1,这个代码还是没问题的

import pandas as pd
import numpy as np

# 创建一个示例 DataFrame
data = {
    'SW_IN': [np.nan, 1, 2, np.nan, 4, np.nan, 6, 7, 8, 9, 10, np.nan],
    'LW_IN': [1, 2, np.nan, 4, np.nan, 6, 7, np.nan, 9, 10, np.nan, 12],
    'WS': [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
}
index = pd.date_range(start="2019-06-26 14:00:00", end="2020-11-17 10:00:00", freq='60min')
siteData_reindexed = pd.DataFrame(data, index=index)

# 计算每天的缺失值比例
rad_daily_miss_rate = siteData_reindexed[["SW_IN", "LW_IN"]].resample('D').apply(lambda x: x.isnull().mean())

# 创建一个新的 DataFrame 来存储填补后的数据
filled_data = siteData_reindexed.copy()

# 遍历每天的缺失值比例
for date, ratios in rad_daily_miss_rate.iterrows():
    print("##" * 30)
    sw_in_ratio = ratios['SW_IN']
    lw_in_ratio = ratios['LW_IN']

    print(date, sw_in_ratio, lw_in_ratio)
    print("前:")
    print(filled_data.loc[date - pd.Timedelta(hours=1): date + pd.Timedelta(hours=23), ["SW_IN", "LW_IN"]])

    # 检查缺失比例
    if sw_in_ratio == 0 and lw_in_ratio == 0:
        print("没有参加填补")
        continue
    elif sw_in_ratio < 0.4 and lw_in_ratio < 0.4:
        # 填补当天的缺失值
        filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']] = filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']].ffill().bfill()
    else:
        # 使用前一天的24小时数据填补
        previous_day = date - pd.Timedelta(days=1)
        if previous_day in filled_data.index:
            print(f"填补前一天的数据: {previous_day}")
            previous_data = filled_data.loc[previous_day:previous_day + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']]
            print("前一天的数据:")
            print(previous_data)

            # 确保赋值的索引对齐
            filled_data.loc[date:date + pd.Timedelta(hours=23), ['SW_IN', 'LW_IN']] = previous_data.copy()
        else:
            print(f"前一天 {previous_day} 的数据不存在")

    print("后:")
    print(filled_data.loc[date - pd.Timedelta(hours=1): date + pd.Timedelta(hours=23), ["SW_IN", "LW_IN"]])

# 结果
# print(filled_data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity通过Vosk实现离线语音识别方法

标注&#xff1a;deepseek直接生成&#xff0c;待验证 在Unity中实现离线语音识别可以通过集成第三方语音识别库来实现。以下是一个使用 Unity 和 Vosk&#xff08;一个开源的离线语音识别库&#xff09;的简单示例。 准备工作 Vosk&#xff1a;一个开源的离线语音识别库&am…

架构学习第七周--Prometheus

目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1&#xff0c;服务发现 4.2&#xff0c;告警功能实现 五、Prometheus与Kubernetes 5.1&#xff0c;Kubernetes指标 5.2&#xff0c;Prometheus集群部署 一、监控系统基础…

技术总结 | MySQL面试知识点

MySQL面试知识点 1.存储引擎1.1 Archive1.2 BlackHole1.3 MyISAM1.4 InnoDB (重点记一下哦)1.5 Memory1.6 CSV 2. 事务2.1. 什么是事务2.2. 事务的特性2.3. 事务的操作sql2.4. 事务的隔离级别 3.三大日志3.1. undo log 回滚日志3.2. redo log 重做日志3.3. bin log 二进制日志4…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技术飞速发展的今天&#xff0c;深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型&#xff0c;凭借其高效的性能和灵活的部署方式&#xff0c;受到了广泛关注。无论是自然语言处理、图像识别&#xff0c;还是…

图论 之 BFS

文章目录 3243.新增道路查询后的最短距离1311.获取你好友已观看的视频 BFS:广度优先搜索&#xff08;BFS&#xff09; 是一种常用的算法&#xff0c;通常用于解决图或树的遍历问题&#xff0c;尤其是寻找最短路径或层级遍历的场景。BFS 的核心思想是使用队列&#xff08;FIFO 数…

VSCode集成deepseek使用介绍(Visual Studio Code)

VSCode集成deepseek使用介绍&#xff08;Visual Studio Code&#xff09; 1. 简介 随着AI辅助编程工具的快速发展&#xff0c;VSCode作为一款轻量级、高度可扩展的代码编辑器&#xff0c;已成为开发者首选的工具之一。DeepSeek作为AI模型&#xff0c;结合Roo Code插件&#x…

Qt中利用httplib调用https接口

httplib中如果要调用https接口&#xff0c;需要开启OPENSSL支持&#xff0c;经过半天坑爹得摸索&#xff0c;总结下经验。 1&#xff0c;下载 并安装Win64OpenSSL 地址如下&#xff0c;我Qt版本是5.15.2 &#xff0c;openssl选择的是 64位&#xff08;Win64OpenSSL-3_3_3.msi…

使用Geotools读取DEM地形数据实战-以湖南省30米数据为例

目录 前言 一、DEM地形数据介绍 1、DEM数据简介 2、DEM应用领域 3、QGIS中读取DEM数据 二、GeoTools解析地形 1、Maven中依赖引用 2、获取数据基本信息 三、总结 前言 随着全球数字化进程的加速&#xff0c;各类地理空间数据呈爆炸式增长&#xff0c;DEM 数据作为其中的…

登录-01.基础登录功能

一.需求分析 当前的页面不需要登录就可以进入&#xff0c;十分不安全&#xff0c;因此要设置登录功能来维护系统的安全性。登录时要根据输入的用户名和密码进行登录校验&#xff0c;如果在数据库中没有找到匹配的用户名和密码的话&#xff0c;那么就无法登录。 因此要先根据用…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

京东杀入外卖界,这波操作到底香不香?

京东杀入外卖界&#xff0c;这波操作到底香不香&#xff1f; 最近外卖圈炸了&#xff01;京东这个电商巨头&#xff0c;居然一声不吭地搞起了外卖&#xff01;一出手就是0佣金&#xff0c;品质堂食 两大杀招&#xff0c;直接把美团、饿了么整懵了。今天咱们就来唠唠&#xff0…

PTH 哈希传递攻击

参考文章&#xff1a;内网渗透 | 哈希传递攻击(Pass-the-Hash,PtH)-腾讯云开发者社区-腾讯云 哈希传递攻击(Pass-the-Hash,PtH)_c 实现 pass the hash功能-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xf…

Vue3项目,蛋糕商城系统

简单的vue3商城 蛋糕商城系统 下单平台 带用户 登录 注册 首页轮播图 购物车后台管理 商品订单 登录注册 商品详情 纯前端无后台、无数据库 纯Vue3项目作业 vue3 setup语法糖写法 技术实现 本项目主要使用如下技术实现&#xff0c; - 基于vue3vite搭建的项目框架 -…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g…

LLM增强强化学习:开启智能决策的新篇章

标题期刊年份关键词Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and MethodsIEEE Transactions on Neural Networks and Learning Systems2024Reinforcement learning (RL), large language models (LLM), vision-language models (V…

ECMAScript6------数组扩展

ECMAScript6------数组扩展 1.扩展运算符1.1 含义1.2 应用(1)复制数组(浅拷贝)(2)合并数组(3)与解构赋值结合(4)字符串(5)实现了Iterator接口的对象(6)Map和Set结构,Generator 函数 2.Array.from和Array.of(1)Array.from(2)Array.of 3.新增的实例方法(1)copyWithin()(2)find(回…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员&#xff0c;发现运维的公司站点被黑页&#xff0c;首页标题被篡改&#xff0c;你获得的信息如下&#xff1a; 操作系统&#xff1a;windows server 2008 R2业务&#xff1a;公司官网网站架构&#xff1a;通过phpstudy运行apache mysqlphp开放端口&…

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体&#xff0c;企业内部知识库通过结构化的信息聚合与动态化的知识流动&#xff0c;为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心&#xff0c;依托数据加密技术构建多层级访问控制机制&#xff0c;确保敏感信…

第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)

重要信息 大会官网&#xff1a;www.amtme.org&#xff08;了解会议&#xff0c;投稿等&#xff09; 大会时间&#xff1a;2025年3月21-23日 大会地点&#xff1a;中国-广州 简介 2025年第十二届先进制造技术与材料工程 (AMTME 2025) 定于2025年3月21-23日在中国广州隆重举…