如何为三年滚动平均值列添加有效数据数量标记列?
为三年滚动平均值列添加有效数据计数列的解决方案
我来帮你梳理下解决这个需求的具体思路,不管你用Python还是R都能轻松实现,下面分步骤说明:
核心思路
首先我们要明确每个三年滚动平均值对应的年度列范围,然后逐行统计这些列中非NA值的数量,最后把统计结果列插入到对应平均值列的右侧,保持你想要的列顺序。
用Python(Pandas)实现的步骤
- 定义窗口与年度列的映射:先把每个三年窗口对应的年度列一一对应好,比如
2014-16对应2014、2015、2016三列。 - 计算有效数据数:利用Pandas的
notna()和sum(axis=1)方法,逐行统计指定年度列里的非空值数量。 - 插入新列到对应位置:找到每个平均值列在原数据中的位置,把统计列插入到它的右侧。
完整代码示例
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)实现的步骤
- 计算各窗口的有效数据数:用
rowSums结合!is.na()统计每行指定年度列的非空值数量。 - 重新排列列顺序:把计数列放到对应平均值列的旁边,确保结构符合要求。
完整代码示例
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
相关产品推荐
相关产品推荐

