You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为三年滚动平均值列添加有效数据数量标记列?

为三年滚动平均值列添加有效数据计数列的解决方案

我来帮你梳理下解决这个需求的具体思路,不管你用Python还是R都能轻松实现,下面分步骤说明:

核心思路

首先我们要明确每个三年滚动平均值对应的年度列范围,然后逐行统计这些列中非NA值的数量,最后把统计结果列插入到对应平均值列的右侧,保持你想要的列顺序。


用Python(Pandas)实现的步骤

  1. 定义窗口与年度列的映射:先把每个三年窗口对应的年度列一一对应好,比如2014-16对应2014、2015、2016三列。
  2. 计算有效数据数:利用Pandas的notna()和sum(axis=1)方法,逐行统计指定年度列里的非空值数量。
  3. 插入新列到对应位置:找到每个平均值列在原数据中的位置,把统计列插入到它的右侧。

完整代码示例

import pandas as pd

# 构造你的示例数据集
data = {
    'country': ['US', 'France', 'Iran'],
    'city': ['NYC', 'Paris', 'Tehran'],
    '2014': [2, pd.NA, 1],
    '2015': [5, 2, pd.NA],
    '2016': [4, 1, pd.NA],
    '2017': [5, 4, pd.NA],
    '2018': [8, pd.NA, 1],
    '2019': [1, 1, 1],
    '2014-16': [3.6, 1.5, 1],
    '2015-17': [4.6, 2, pd.NA],
    '2016-18': [5.6, 2.5, 1],
    '2017-19': [4.6, 1.6, 1]
}
df = pd.DataFrame(data)

# 定义每个三年窗口对应的年度列
window_to_years = {
    '2014-16': ['2014', '2015', '2016'],
    '2015-17': ['2015', '2016', '2017'],
    '2016-18': ['2016', '2017', '2018'],
    '2017-19': ['2017', '2018', '2019']
}

# 遍历每个窗口生成计数列并插入到对应位置
for window_col, year_cols in window_to_years.items():
    count_col = f'n. of data {window_col}'
    # 计算当前窗口的有效数据数量
    df[count_col] = df[year_cols].notna().sum(axis=1)
    # 获取原平均值列的位置,插入到它后面
    col_index = df.columns.get_loc(window_col)
    df.insert(col_index + 1, count_col, df.pop(count_col))

# 输出结果
print(df)

用R(dplyr)实现的步骤

  1. 计算各窗口的有效数据数:用rowSums结合!is.na()统计每行指定年度列的非空值数量。
  2. 重新排列列顺序:把计数列放到对应平均值列的旁边,确保结构符合要求。

完整代码示例

library(dplyr)

# 构造示例数据集
df <- tibble(
  country = c("US", "France", "Iran"),
  city = c("NYC", "Paris", "Tehran"),
  `2014` = c(2, NA, 1),
  `2015` = c(5, 2, NA),
  `2016` = c(4, 1, NA),
  `2017` = c(5, 4, NA),
  `2018` = c(8, NA, 1),
  `2019` = c(1, 1, 1),
  `2014-16` = c(3.6, 1.5, 1),
  `2015-17` = c(4.6, 2, NA),
  `2016-18` = c(5.6, 2.5, 1),
  `2017-19` = c(4.6, 1.6, 1)
)

# 添加计数列并调整顺序
df <- df %>%
  mutate(
    `n. of data 2014-16` = rowSums(!is.na(c_across(`2014`:`2016`))),
    `n. of data 2015-17` = rowSums(!is.na(c_across(`2015`:`2017`))),
    `n. of data 2016-18` = rowSums(!is.na(c_across(`2016`:`2018`))),
    `n. of data 2017-19` = rowSums(!is.na(c_across(`2017`:`2019`)))
  ) %>%
  select(
    country, city, `2014`:`2019`,
    `2014-16`, `n. of data 2014-16`,
    `2015-17`, `n. of data 2015-17`,
    `2016-18`, `n. of data 2016-18`,
    `2017-19`, `n. of data 2017-19`
  )

# 查看结果
print(df)

内容的提问来源于stack exchange,提问作者Helena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:12:47