如何利用行列总计反向计算填充数据集的列缺失值(NA)
解决方案
针对你的带行列总计的缺失值补全需求,可以分两步处理:先补全行内缺失值,再利用列总计补全剩余缺失值。以下是R和Python的具体实现:
R 实现
# 读取CSV数据 df <- read.csv("your_data.csv", stringsAsFactors = FALSE) # 1. 补全行内缺失值(基于行总计VS) row_indices <- df$ID != "AS" for (i in which(row_indices)) { row_vals <- df[i, c("V1", "V2", "V3")] sum_non_na <- sum(row_vals, na.rm = TRUE) na_positions <- which(is.na(row_vals)) if (length(na_positions) > 0) { df[i, na_positions + 1] <- df[i, "VS"] - sum_non_na } } # 2. 补全列内缺失值(基于列总计AS行) col_names <- c("V1", "V2", "V3") total_vals <- df[df$ID == "AS", col_names] for (col in col_names) { col_vals <- df[row_indices, col] sum_non_na <- sum(col_vals, na.rm = TRUE) na_positions <- which(is.na(col_vals)) if (length(na_positions) > 0) { df[na_positions, col] <- total_vals[[col]] - sum_non_na } } # 查看补全后的结果 print(df)
Python Pandas 实现
import pandas as pd # 读取CSV数据 df = pd.read_csv("your_data.csv") # 1. 补全行内缺失值(基于行总计VS) non_total_rows = df["ID"] != "AS" for idx, row in df[non_total_rows].iterrows(): row_sum = row[["V1", "V2", "V3"]].sum(skipna=True) na_cols = row[["V1", "V2", "V3"]].isna() if na_cols.any(): df.loc[idx, na_cols] = row["VS"] - row_sum # 2. 补全列内缺失值(基于列总计AS行) total_row = df[df["ID"] == "AS"].iloc[0] cols_to_fill = ["V1", "V2", "V3"] for col in cols_to_fill: col_vals = df[non_total_rows][col] col_sum = col_vals.sum(skipna=True) na_pos = col_vals.isna() if na_pos.any(): df.loc[non_total_rows & na_pos, col] = total_row[col] - col_sum # 输出补全后的结果 print(df)
逻辑说明
- 行缺失补全:对每一行(排除总计行
AS),用该行的总计VS减去该行已有的非缺失值之和,得到缺失值的补全数。比如示例中A2的V1 = 32 - (11+12) = 9。 - 列缺失补全:在完成行补全后,对每一列(排除
ID和VS),用该列的总计(AS行对应值)减去该列已有的非缺失值之和,得到剩余缺失值。比如示例中A3的V1 = 27 - (11+9) =7,V3=32-(13+12)=5。
内容的提问来源于stack exchange,提问作者benne
相关产品推荐
相关产品推荐

