如何在Python中压缩含空值的数据集以减少列数?
解决方案
针对你需要将每行非空值向左对齐、减少列数的需求,用Python的Pandas可以快速实现,以下是具体步骤和代码:
核心思路
保留sha列作为唯一标识,对其余列的每一行提取非空值,将这些值依次填充到前列,空位置留空(或NaN),最终列数等于所有行中非空值的最大数量。
代码实现(Pandas版)
import pandas as pd # 读取你的数据集(如果是Excel用pd.read_excel) df = pd.read_csv("your_dataset.csv") # 分离标识列和数据列 sha_column = df[["sha"]] data_columns = df.drop("sha", axis=1) # 对每行处理:过滤空值后重新生成Series,自动向左对齐 processed_data = data_columns.apply(lambda row: pd.Series(row.dropna().values), axis=1) # 合并标识列和处理后的数据 final_df = pd.concat([sha_column, processed_data], axis=1) # 给新列命名(你不在意列名的话可以随便命名) final_df.columns = ["sha"] + [f"col_{i}" for i in range(final_df.shape[1]-1)] # 查看结果或保存 print(final_df) # final_df.to_csv("processed_dataset.csv", index=False)
优化版(针对大数据集)
如果你的数据集行数很多,apply方法效率较低,可以用Numpy提升速度:
import pandas as pd import numpy as np df = pd.read_csv("your_dataset.csv") sha_column = df[["sha"]] data_array = df.drop("sha", axis=1).values # 根据空值类型生成掩码:如果空值是空字符串用`!= ''`,如果是NaN用`pd.notna()` mask = data_array != '' processed_rows = [] for row in data_array: # 提取当前行的非空值 non_empty_vals = row[mask[row]] # 补全到原列数长度(空位置填默认值) padded_row = np.pad(non_empty_vals, (0, mask.shape[1] - len(non_empty_vals)), mode='constant', constant_values='') processed_rows.append(padded_row) # 转换为DataFrame并合并 processed_data = pd.DataFrame(processed_rows) final_df = pd.concat([sha_column, processed_data], axis=1) final_df.columns = ["sha"] + [f"col_{i}" for i in range(final_df.shape[1]-1)]
内容的提问来源于stack exchange,提问作者Giammaria GIORDANO
相关产品推荐
相关产品推荐

