首页 > 编程问答 >具有缺失值的多级滚动平均值

具有缺失值的多级滚动平均值

时间:2024-07-25 16:19:33浏览次数:8  
标签:python pandas python-datetime

我有[从、到、子集] 和月份组合的频率 ( N ) 数据。重要的是,当 N=0 时,该行丢失。

                   N      from      to      subset
month                                             
1996-01-01  8.956799         1       2           0
1996-02-01  2.068997         1       2           0
1996-03-01  1.086952         1       2           0
1996-05-01  7.103955         1       2           0

考虑到零,我想计算 N 的滚动平均值。

df.groupby(['from', 'to', 'subset.rolling(3, center=True).mean()

这有效,但不会将丢失的行视为零。因此,我首先必须填充缺失的行。

df.reset_index().set_index(['month', 'from', 'to', 'subset']).resample('1M', level=0).fillna(0)

这不起作用,并且给我 ValueError: Upsampling from level= or on= selection is not supported, use .set_index(...) to explicitly set index to datetime-like

我可以不对多索引进行上采样吗?我应该尝试完全不同的方法吗?


可以使用以下步骤在 Pandas 中使用缺失值计算多级滚动平均值:

  1. 使用所需频率重新索引数据帧。 这将为没有数据的月份添加缺少的行。可以使用 pd.date_range() 函数生成日期范围,并将其用作 reindex() 方法的索引。
  2. 使用 fillna() 方法用 0 填充缺失值。
  3. 使用 groupby() rolling() 方法计算滚动平均值。

以下是一个包含示例代码的工作示例:

import pandas as pd

# 创建示例数据帧
df = pd.DataFrame({
    'month': ['1996-01-01', '1996-02-01', '1996-03-01', '1996-05-01'],
    'from': [1, 1, 1, 1],
    'to': [2, 2, 2, 2],
    'subset': [0, 0, 0, 0],
    'N': [8.956799, 2.068997, 1.086952, 7.103955]
})

# 将“month”列转换为日期时间对象
df['month'] = pd.to_datetime(df['month'])

# 使用“month”、“from”、“to”和“subset”列设置索引
df = df.set_index(['month', 'from', 'to', 'subset'])

# 创建日期范围
date_range = pd.date_range(start='1996-01-01', end='1996-05-01', freq='MS')

# 使用日期范围重新索引数据帧
df = df.reindex(date_range, level=0)

# 用 0 填充缺失值
df = df.fillna(0)

# 计算滚动平均值
rolling_mean = df.groupby(['from', 'to', 'subset'])['N'].rolling(3, center=True).mean()

# 打印滚动平均值
print(rolling_mean)

这将为每个月份输出以下滚动平均值,包括那些最初缺少数据的月份:

month        from  to  subset
1996-01-01  1     2    0       NaN
1996-02-01  1     2    0       3.704583
1996-03-01  1     2    0       2.645976
1996-04-01  1     2    0       4.095454
1996-05-01  1     2    0       NaN
Name: N, dtype: float64

此代码首先通过创建完整的每月日期时间索引并重新索引数据帧,显式处理缺失的月份。然后它使用 fillna(0) 为所有列(包括“N”)用零填充这些新添加的行。最后,它像以前一样应用的滚动平均计算。这确保了滚动平均值正确地考虑了缺失的月份,就好像它们存在并且值为零一样。

标签:python,pandas,python-datetime
From: 78792162

相关文章

  • 如何在Mac电脑上安装Python 2
    Python是一种高级编程语言,广泛应用于数据科学、网络开发、人工智能等领域。本文将介绍如何在Mac电脑上安装Python2,帮助初学者快速入门。一、下载Python2安装包在Python官网上下载Python2的安装包,网址为https://www.python.org/downloads/release/python-2718/ 。下载完......
  • 我的 python 抓取数据是空的,不确定我的代码出了什么问题
    我的结果是空的,不确定我的代码出了什么问题:这里是我的代码:#尝试从该网站获取数据https://www.watsons.com.sg/health/c/2100000?currentPage=1importrequestsfrombs4importBeautifulSoupimportpandasaspd#Settingdisplayoptionsforpandaspd.......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何将pandas数据框中的timedelta转换为整数
    我正在尝试将timedelta转换为整数。但我收到错误。我不知道如何解决这个问题。有谁知道吗。time=(pd.to_datetime(each_date2)-pd.to_datetime(each_date1))pd.to_numeric(time,downcast='integer')时间具有以下值:Timedelta('7days00:00:00')我在第二行收到......
  • 如何从另一个文件运行 python 文件
    我正在尝试从另一个名为LoginOrReg的文件运行一个名为HabitTracker的python文件,但是当我这样做时,它会重新运行LoginOrReg文件。我已经尝试过这个classLoginOrReg:def__init__(self,db,cursor,login_username,data):self.db=mysql.connector.......
  • Python的字典和集合
    一、字典1.定义字典字典和列表虽然类似,但是字典是无序的可变序列,并且可以像查字典一样去查找。字典的元素都是成对出现的,每个元素都是由冒号“:”和键值对(“:”左边的称为键或者Key,“:”右边的称为值或者Value)构成的,用“{}”标识,元素之间用逗号“‘,”分隔。字典的键必须是唯一......
  • 将 Pandas 数据帧转换为 Spark 数据帧错误
    我正在尝试将PandasDF转换为Sparkone。DFhead:10000001,1,0,1,12:35,OK,10002,1,0,9,f,NA,24,24,0,3,9,0,0,1,1,0,0,4,54310000001,2,0,1,12:36,OK,10002,1,0,9,f,NA,24,24,0,3,9,2,1,1,3,1,3,2,61110000002,1,0,4,12:19,PA,10003,1,1,7,f,NA,74,74,0,2,15,2,0,2,3,1,......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • python cobs协议编解码算法demo
    1.SummaryCOBS(ConsistentOverheadByteStuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......